Import data
serology <- read_csv("./01_data/raw/FFI.peru.serology.kmeans2.csv") %>%
rename(ffi_is_code = Codigo) %>%
select(-1)
ffi_individual <- read_csv("./01_data/raw/individuals_result_share_072022.csv")
ffi_household <- read_csv("./01_data/raw/household_gps_share_072022.csv")
data_2000_2019 <- read_csv("./01_data/raw/Data_FFI_2000_2019_20212405.csv")
data_2020_2021 <- read_csv("./01_data/raw/Data_FFI_2020_2021_20210629.csv")
poblacion <- readRDS("./01_data/raw/poblacion_inei_2017.rds")
Format data
ffi_total <- ffi_individual %>%
full_join(
serology %>%
mutate(
ffi_is_code = paste0(0, ffi_is_code)
),
by = "ffi_is_code"
)
ffi_total <- ffi_total %>%
mutate(
age_cat = case_when(
ffi_is_age_fixed >= 70 ~ "[70+)",
ffi_is_age_fixed >= 60 ~ "[60-70)",
ffi_is_age_fixed >= 50 ~ "[50-60)",
ffi_is_age_fixed >= 40 ~ "[40-50)",
ffi_is_age_fixed >= 30 ~ "[30-40)",
ffi_is_age_fixed >= 20 ~ "[20-30)",
ffi_is_age_fixed >= 10 ~ "[10-20)",
ffi_is_age_fixed >= 0 ~ "[0-10)"
),
age_cat = factor(age_cat),
age_code = case_when(
age_cat == "[70+)" ~ 8,
age_cat == "[60-70)" ~ 7,
age_cat == "[50-60)" ~ 6,
age_cat == "[40-50)" ~ 5,
age_cat == "[30-40)" ~ 4,
age_cat == "[20-30)" ~ 3,
age_cat == "[10-20)" ~ 2,
age_cat == "[0-10)" ~ 1,
),
gender = factor(
ffi_is_sex,
labels = c("Male", "Female")
),
ffi_is_malaria = factor(
ffi_is_malaria,
labels = c("No", "Yes", "Don't Know / No Answer")
),
across(
c(pf_recent:pv_historic),
~ factor(., labels = c("Negative", "Positive"))
),
across(
c(
ffi_is_fever_month,
ffi_is_antimal_drug_use,
ffi_is_mosq_net
),
~ factor(., labels = c("No", "Yes"))
),
ffi_is_trip_month = factor(
ffi_is_trip_month,
labels = c("No", "Yes", "Don't Know/No Answer")
),
ffi_is_mal_lifetime = factor(
ffi_is_mal_lifetime,
labels = c(
"1 to 3 times",
"3 to 7 times",
"More than 7 times"
)
),
ffi_is_place_shower = factor(
ffi_is_place_shower,
labels = c(
"Bathroom inside the dwelling",
"Bathroom outside the dwelling",
"In the countryside/river",
"Other"
)
),
education_level = case_when(
ffi_is_inst_level %in% 0 ~ "No schooling",
ffi_is_inst_level %in% 1:2 ~ "Primary school",
ffi_is_inst_level %in% 3:4 ~ "Secondary school",
ffi_is_inst_level %in% 5:6 ~ "Higher education"
),
education_level = fct_relevel(education_level, "No schooling",
"Primary school",
"Secondary school"),
economic_activities = factor(ffi_is_main_econ_act,
labels = c("Day labourer",
"Wood extractor",
"Fisherman",
"Livestock farmer",
"Farmer",
"Trader",
"Housewife",
"Student",
"Motorcycle taxi driver",
"None",
"Other")),
pv_exposure = case_when(
pv_recent == "Negative" & pv_historic == "Negative" ~ "Negative",
is.na(pv_recent) & is.na(pv_historic) ~ NA_character_,
TRUE ~ "Positive"
),
pf_exposure = case_when(
pf_recent == "Negative" & pf_historic == "Negative" ~ "Negative",
is.na(pf_recent) & is.na(pf_historic) ~ NA_character_,
TRUE ~ "Positive"
),
recent_exposure = case_when(
pv_recent == "Negative" & pf_recent == "Negative" ~ "Negative",
is.na(pv_recent) & is.na(pf_recent) ~ NA_character_,
TRUE ~ "Positive"
),
historical_exposure = case_when(
pv_historic == "Negative" & pf_historic == "Negative" ~ "Negative",
is.na(pv_historic) & is.na(pf_historic) ~ NA_character_,
TRUE ~ "Positive"
),
only_pv_exposure = case_when(
pv_exposure == "Positive" & pf_exposure == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
only_pf_exposure = case_when(
pf_exposure == "Positive" & pv_exposure == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
pv_pf_exposure = case_when(
pv_exposure == "Positive" & pf_exposure == "Positive" ~ "Positive",
TRUE ~ "Negative"
),
freedom_malaria = case_when(
pv_exposure == "Negative" & pf_exposure == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
only_pv_recent = case_when(
pv_recent == "Positive" & pf_recent == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
only_pf_recent = case_when(
pf_recent == "Positive" & pv_recent == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
pv_pf_recent = case_when(
pv_recent == "Positive" & pf_recent == "Positive" ~ "Positive",
TRUE ~ "Negative"
),
freedom_malaria_recent = case_when(
pv_recent == "Negative" & pf_recent == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
only_pv_historic = case_when(
pv_historic == "Positive" & pf_historic == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
only_pf_historic = case_when(
pf_historic == "Positive" & pv_historic == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
pv_pf_historic = case_when(
pv_historic == "Positive" & pf_historic == "Positive" ~ "Positive",
TRUE ~ "Negative"
),
freedom_malaria_historic = case_when(
pv_historic == "Negative" & pf_historic == "Negative" ~ "Positive",
TRUE ~ "Negative"
),
across(c(pv_exposure:freedom_malaria_historic), factor)
)
labelled::var_label(ffi_total) <- list(
ffi_is_district = "Districs",
gender = "Gender",
age_cat = "Age",
education_level = "Education Level",
economic_activities = "Economic Activities",
pf_recent = "Recent P. Falciparum",
pf_historic = "Historical P. Falciparum",
pv_recent = "Recent P. Vivax",
pv_historic = "Historical P. Vivax",
pv_exposure = "P. Vivax Exposure",
pf_exposure = "P. Falciparum Exposure"
)
saveRDS(ffi_total,
file = "01_data/processed/ffi_total.rds")
Table descriptive
library(gtsummary)
fisher.test.simulate.p.values <- function(data, variable, by, ...) {
result <- list()
test_results <- stats::fisher.test(data[[variable]], data[[by]], simulate.p.value = TRUE)
result$p <- test_results$p.value
result$test <- test_results$method
result
}
Table for district
table_1 <- ffi_total %>%
select(
ffi_is_district,
gender,
age_cat,
education_level,
economic_activities,
pf_recent:pv_historic
) %>%
tbl_summary(
by = "ffi_is_district",
missing_text = "Missing"
) %>%
add_n() %>%
add_overall() %>%
add_p(
test = list(all_categorical() ~ "fisher.test.simulate.p.values")
) %>%
bold_p() %>%
modify_header(label = "**Variable**") %>%
bold_labels()
table1
## # A tibble: 6 × 4
## country year cases population
## <chr> <int> <int> <int>
## 1 Afghanistan 1999 745 19987071
## 2 Afghanistan 2000 2666 20595360
## 3 Brazil 1999 37737 172006362
## 4 Brazil 2000 80488 174504898
## 5 China 1999 212258 1272915272
## 6 China 2000 213766 1280428583
table_1 %>%
as_flex_table() %>%
flextable::save_as_docx(path = "./02_output/reports/table1.docx")
Table for Plasmodium
table2 <- ffi_total %>%
select(
gender,
age_cat,
education_level,
economic_activities,
pf_exposure,
pv_exposure
) %>%
drop_na(pf_exposure, pv_exposure) %>%
pivot_longer(
cols = pv_exposure:pf_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "pv_exposure" ~ "P. Vivax Exposure",
exposure == "pf_exposure" ~ "P. Falciparum Exposure"
)
) %>%
tbl_strata(
strata = exposure,
.tbl_fun =
~ .x %>%
tbl_summary(
by = result_exposure,
missing_text = "Missing"
) %>%
add_p(
test = list(all_categorical() ~ "fisher.test.simulate.p.values")
) %>%
bold_p() %>%
modify_header(label = "**Variable**") %>%
bold_labels()
)
table2_overall <- ffi_total %>%
select(
gender,
age_cat,
education_level,
economic_activities,
pf_exposure,
pv_exposure
) %>%
drop_na(pf_exposure, pv_exposure) %>%
tbl_summary(
missing_text = "Missing"
) %>%
modify_header(
label = "**Variable**"
) %>%
bold_labels() %>%
modify_spanning_header(stat_0 ~ "**Overall**")
table2 <- tbl_merge(
tbls = list(table2, table2_overall),
tab_spanner = FALSE
)
table2
| Variable |
P. Falciparum Exposure
|
P. Vivax Exposure
|
Overall
|
|
Negative, N = 3,897
|
Positive, N = 99
|
p-value
|
Negative, N = 3,683
|
Positive, N = 313
|
p-value
|
N = 3,996
|
| Gender |
|
|
0.083 |
|
|
<0.001 |
|
| Male |
2,007 (52%) |
60 (61%) |
|
1,839 (50%) |
228 (73%) |
|
2,067 (52%) |
| Female |
1,890 (48%) |
39 (39%) |
|
1,844 (50%) |
85 (27%) |
|
1,929 (48%) |
| Age |
|
|
0.013 |
|
|
<0.001 |
|
| [0-10) |
1,075 (28%) |
15 (15%) |
|
1,089 (30%) |
1 (0.3%) |
|
1,090 (27%) |
| [10-20) |
905 (23%) |
19 (19%) |
|
913 (25%) |
11 (3.5%) |
|
924 (23%) |
| [20-30) |
372 (9.6%) |
8 (8.2%) |
|
360 (9.8%) |
20 (6.4%) |
|
380 (9.5%) |
| [30-40) |
423 (11%) |
11 (11%) |
|
380 (10%) |
54 (17%) |
|
434 (11%) |
| [40-50) |
350 (9.0%) |
13 (13%) |
|
300 (8.2%) |
63 (20%) |
|
363 (9.1%) |
| [50-60) |
332 (8.5%) |
14 (14%) |
|
285 (7.8%) |
61 (20%) |
|
346 (8.7%) |
| [60-70) |
212 (5.5%) |
8 (8.2%) |
|
177 (4.8%) |
43 (14%) |
|
220 (5.5%) |
| [70+) |
219 (5.6%) |
10 (10%) |
|
170 (4.6%) |
59 (19%) |
|
229 (5.7%) |
| Missing |
9 |
1 |
|
9 |
1 |
|
10 |
| Education Level |
|
|
0.023 |
|
|
<0.001 |
|
| No schooling |
754 (19%) |
10 (10%) |
|
743 (20%) |
21 (6.7%) |
|
764 (19%) |
| Primary school |
1,866 (48%) |
59 (60%) |
|
1,723 (47%) |
202 (65%) |
|
1,925 (48%) |
| Secondary school |
1,176 (30%) |
30 (30%) |
|
1,117 (30%) |
89 (28%) |
|
1,206 (30%) |
| Higher education |
98 (2.5%) |
0 (0%) |
|
97 (2.6%) |
1 (0.3%) |
|
98 (2.5%) |
| Missing |
3 |
0 |
|
3 |
0 |
|
3 |
| Economic Activities |
|
|
0.001 |
|
|
<0.001 |
|
| Day labourer |
854 (22%) |
13 (13%) |
|
847 (23%) |
20 (6.4%) |
|
867 (22%) |
| Wood extractor |
30 (0.8%) |
3 (3.1%) |
|
27 (0.7%) |
6 (1.9%) |
|
33 (0.8%) |
| Fisherman |
25 (0.6%) |
2 (2.0%) |
|
20 (0.5%) |
7 (2.2%) |
|
27 (0.7%) |
| Livestock farmer |
72 (1.8%) |
3 (3.1%) |
|
62 (1.7%) |
13 (4.2%) |
|
75 (1.9%) |
| Farmer |
1 (<0.1%) |
0 (0%) |
|
1 (<0.1%) |
0 (0%) |
|
1 (<0.1%) |
| Trader |
873 (22%) |
37 (38%) |
|
723 (20%) |
187 (60%) |
|
910 (23%) |
| Housewife |
100 (2.6%) |
4 (4.1%) |
|
99 (2.7%) |
5 (1.6%) |
|
104 (2.6%) |
| Student |
656 (17%) |
16 (16%) |
|
619 (17%) |
53 (17%) |
|
672 (17%) |
| Motorcycle taxi driver |
1,128 (29%) |
19 (19%) |
|
1,136 (31%) |
11 (3.5%) |
|
1,147 (29%) |
| None |
21 (0.5%) |
0 (0%) |
|
20 (0.5%) |
1 (0.3%) |
|
21 (0.5%) |
| Other |
135 (3.5%) |
1 (1.0%) |
|
126 (3.4%) |
10 (3.2%) |
|
136 (3.4%) |
| Missing |
2 |
1 |
|
3 |
0 |
|
3 |
| P. Falciparum Exposure |
|
|
|
|
|
|
|
| Negative |
|
|
|
|
|
|
3,897 (98%) |
| Positive |
|
|
|
|
|
|
99 (2.5%) |
| P. Vivax Exposure |
|
|
|
|
|
|
|
| Negative |
|
|
|
|
|
|
3,683 (92%) |
| Positive |
|
|
|
|
|
|
313 (7.8%) |
table2 %>%
as_flex_table() %>%
flextable::save_as_docx(path = "./02_output/reports/table2.docx")
Table for Exposure Time
table3 <- ffi_total %>%
select(
gender,
age_cat,
education_level,
economic_activities,
recent_exposure,
historical_exposure
) %>%
drop_na(recent_exposure, historical_exposure) %>%
pivot_longer(
cols = recent_exposure:historical_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "recent_exposure" ~ "Recent Exposure",
exposure == "historical_exposure" ~ "Historical Exposure"
)
) %>%
tbl_strata(
strata = exposure,
.tbl_fun =
~ .x %>%
tbl_summary(
by = result_exposure,
missing_text = "Missing"
) %>%
add_p(
test = list(all_categorical() ~ "fisher.test.simulate.p.values")
) %>%
bold_p() %>%
modify_header(label = "**Variable**") %>%
bold_labels()
)
table3_overall <- ffi_total %>%
select(
gender,
age_cat,
education_level,
economic_activities,
recent_exposure,
historical_exposure
) %>%
drop_na(recent_exposure, historical_exposure) %>%
tbl_summary(
missing_text = "Missing"
) %>%
modify_header(
label = "**Variable**"
) %>%
bold_labels() %>%
modify_spanning_header(stat_0 ~ "**Overall**")
table3 <- tbl_merge(
tbls = list(table3, table3_overall),
tab_spanner = FALSE
)
table3
| Variable |
Historical Exposure
|
Recent Exposure
|
Overall
|
|
Negative, N = 3,728
|
Positive, N = 268
|
p-value
|
Negative, N = 3,793
|
Positive, N = 203
|
p-value
|
N = 3,996
|
| Gender |
|
|
<0.001 |
|
|
<0.001 |
|
| Male |
1,886 (51%) |
181 (68%) |
|
1,910 (50%) |
157 (77%) |
|
2,067 (52%) |
| Female |
1,842 (49%) |
87 (32%) |
|
1,883 (50%) |
46 (23%) |
|
1,929 (48%) |
| Age |
|
|
<0.001 |
|
|
<0.001 |
|
| [0-10) |
1,085 (29%) |
5 (1.9%) |
|
1,079 (29%) |
11 (5.5%) |
|
1,090 (27%) |
| [10-20) |
899 (24%) |
25 (9.3%) |
|
918 (24%) |
6 (3.0%) |
|
924 (23%) |
| [20-30) |
366 (9.8%) |
14 (5.2%) |
|
366 (9.7%) |
14 (7.0%) |
|
380 (9.5%) |
| [30-40) |
392 (11%) |
42 (16%) |
|
406 (11%) |
28 (14%) |
|
434 (11%) |
| [40-50) |
309 (8.3%) |
54 (20%) |
|
327 (8.6%) |
36 (18%) |
|
363 (9.1%) |
| [50-60) |
303 (8.1%) |
43 (16%) |
|
305 (8.1%) |
41 (20%) |
|
346 (8.7%) |
| [60-70) |
182 (4.9%) |
38 (14%) |
|
197 (5.2%) |
23 (11%) |
|
220 (5.5%) |
| [70+) |
182 (4.9%) |
47 (18%) |
|
187 (4.9%) |
42 (21%) |
|
229 (5.7%) |
| Missing |
10 |
0 |
|
8 |
2 |
|
10 |
| Education Level |
|
|
<0.001 |
|
|
<0.001 |
|
| No schooling |
747 (20%) |
17 (6.3%) |
|
745 (20%) |
19 (9.4%) |
|
764 (19%) |
| Primary school |
1,754 (47%) |
171 (64%) |
|
1,792 (47%) |
133 (66%) |
|
1,925 (48%) |
| Secondary school |
1,126 (30%) |
80 (30%) |
|
1,156 (31%) |
50 (25%) |
|
1,206 (30%) |
| Higher education |
98 (2.6%) |
0 (0%) |
|
97 (2.6%) |
1 (0.5%) |
|
98 (2.5%) |
| Missing |
3 |
0 |
|
3 |
0 |
|
3 |
| Economic Activities |
|
|
<0.001 |
|
|
<0.001 |
|
| Day labourer |
849 (23%) |
18 (6.7%) |
|
848 (22%) |
19 (9.4%) |
|
867 (22%) |
| Wood extractor |
29 (0.8%) |
4 (1.5%) |
|
28 (0.7%) |
5 (2.5%) |
|
33 (0.8%) |
| Fisherman |
21 (0.6%) |
6 (2.2%) |
|
22 (0.6%) |
5 (2.5%) |
|
27 (0.7%) |
| Livestock farmer |
63 (1.7%) |
12 (4.5%) |
|
67 (1.8%) |
8 (3.9%) |
|
75 (1.9%) |
| Farmer |
1 (<0.1%) |
0 (0%) |
|
1 (<0.1%) |
0 (0%) |
|
1 (<0.1%) |
| Trader |
770 (21%) |
140 (52%) |
|
787 (21%) |
123 (61%) |
|
910 (23%) |
| Housewife |
99 (2.7%) |
5 (1.9%) |
|
100 (2.6%) |
4 (2.0%) |
|
104 (2.6%) |
| Student |
623 (17%) |
49 (18%) |
|
646 (17%) |
26 (13%) |
|
672 (17%) |
| Motorcycle taxi driver |
1,124 (30%) |
23 (8.6%) |
|
1,139 (30%) |
8 (3.9%) |
|
1,147 (29%) |
| None |
20 (0.5%) |
1 (0.4%) |
|
21 (0.6%) |
0 (0%) |
|
21 (0.5%) |
| Other |
127 (3.4%) |
9 (3.4%) |
|
131 (3.5%) |
5 (2.5%) |
|
136 (3.4%) |
| Missing |
2 |
1 |
|
3 |
0 |
|
3 |
| recent_exposure |
|
|
|
|
|
|
|
| Negative |
|
|
|
|
|
|
3,793 (95%) |
| Positive |
|
|
|
|
|
|
203 (5.1%) |
| historical_exposure |
|
|
|
|
|
|
|
| Negative |
|
|
|
|
|
|
3,728 (93%) |
| Positive |
|
|
|
|
|
|
268 (6.7%) |
table3 %>%
as_flex_table() %>%
flextable::save_as_docx(path = "./02_output/reports/table3.docx")
Distance communities and regional Hospital
iquitos_centro <- tibble(
"ffi_h_health_facility_name" = "Hospital Regional de Loreto",
Longitude = -73.25385902080906,
Latitude = -3.7264060164148716,
) %>%
st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326) %>%
st_transform(crs = 32718)
communities_sf <- ffi_household %>%
select(
ffi_h_district,
ffi_h_code_community,
ffi_h_community,
ffi_gps_long,
ffi_gps_lat
) %>%
st_as_sf(
coords = c("ffi_gps_long", "ffi_gps_lat"),
crs = 4326
) %>%
group_by(ffi_h_district, ffi_h_code_community, ffi_h_community) %>%
summarise() %>%
st_centroid()
communities_distances <- communities_sf %>%
st_transform(crs = 32718) %>%
st_distance(iquitos_centro)
communities_distances <- enframe(communities_distances) %>%
mutate(
ffi_is_cod_com = communities_sf$ffi_h_code_community,
ffi_is_community = communities_sf$ffi_h_community,
distance = as.numeric(value)
) %>%
select(-c(name, value))
Las Comunidades mas cercanas y mas lejanas por distrito:
communities_distances %>%
mutate(
ffi_h_district = communities_sf$ffi_h_district
) %>%
group_by(ffi_h_district) %>%
slice_min(distance, n = 1) %>%
bind_rows(
communities_distances %>%
mutate(
ffi_h_district = communities_sf$ffi_h_district
) %>%
group_by(ffi_h_district) %>%
slice_max(distance, n = 1)
) %>%
arrange(ffi_h_district, distance)
## # A tibble: 4 × 4
## # Groups: ffi_h_district [2]
## ffi_is_cod_com ffi_is_community distance ffi_h_district
## <chr> <chr> <dbl> <chr>
## 1 30 URB. BAGAZAN 4136. BELEN
## 2 20 PEÑA BLANCA 42830. BELEN
## 3 11 VILLA ESTHER 17189. INDIANA
## 4 02 MANATI ZONA 2 53093. INDIANA
Plots
Malaria Annual Parasite Index
data_malaria <- bind_rows(
data_2000_2019,
data_2020_2021
) %>%
drop_na(District)
pob_loreto <- poblacion %>%
filter(dep == "LORETO") %>%
select(District = distr, Total)
malaria_cases_pob <- data_malaria %>%
rowwise() %>%
mutate(
cases_malaria = sum(
c_across(c(
`Confirmed P. Falciparum`,
`Confirmed P. Vivax`
)),
na.rm = TRUE
)
) %>%
group_by(District) %>%
summarise(cases_malaria = sum(cases_malaria))
malaria_cases_pob <- malaria_cases_pob %>%
left_join(
pob_loreto
) %>%
mutate(
api = cases_malaria * 1000 / Total
)
data(Peru, package = "innovar")
malaria_cases_pob_sf <- Peru %>%
filter(dep == "LORETO") %>%
select(District = distr, geometry) %>%
right_join(
malaria_cases_pob
)
figure1 <- ggplot(malaria_cases_pob_sf) +
geom_sf(aes(fill = api, geometry = geometry)) +
geom_sf(data = malaria_cases_pob_sf %>% dplyr::filter(District == "BELEN"), colour = "#aa6439", fill = NA, size = 1.5, aes(fill = api, geometry = geometry)) +
geom_sf(data = malaria_cases_pob_sf %>% dplyr::filter(District == "INDIANA"), colour = "#256e5d", fill = NA, size = 1.5, aes(fill = api, geometry = geometry)) +
scale_fill_distiller(
name = "API",
na.value = "black",
# limits = c(0, 4000),
palette = "RdYlGn",
direction = -1,
breaks = scales::pretty_breaks(n = 5),
values = c(
0,
0.001,
0.002,
0.005,
0.008,
0.01,
0.02,
0.03,
0.05,
0.1,
0.6,
0.9,
1
)
) +
labs(
x = NULL,
y = NULL,
title = NULL
) +
theme_classic() +
geom_sf_label_repel(
data = malaria_cases_pob_sf %>% dplyr::filter(District == "BELEN"),
aes(label = District),
min.segment.length = 0,
force = 100,
nudge_x = -1,
seed = 10,
colour = "#aa6439"
) +
geom_sf_label_repel(
data = malaria_cases_pob_sf %>% dplyr::filter(District == "INDIANA"),
aes(label = District),
min.segment.length = 0,
force = 100,
nudge_x = 1,
seed = 10,
colour = "#256e5d"
)
figure1

ggsave(
"./02_output/plots/figure1.png",
figure1,
device = grDevices::png,
dpi = 300
)
Serological Results
By communities and type of plasmodium/time
# ffi_total %>%
# ggplot(aes(
# x = ffi_is_community,
# fill = pv_historic
# )) +
# coord_flip(ylim = c(0, 0.25)) +
# geom_bar(position = "fill")
plot1 <- ffi_total %>%
drop_na(pf_recent:pv_historic) %>%
left_join(
communities_distances
) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
ffi_is_community = str_to_title(ffi_is_community),
ffi_is_community = paste0(
ffi_is_community,
" (",
str_to_title(ffi_is_district),
")"
),
ffi_is_community = fct_reorder(
ffi_is_community,
distance,
.desc = TRUE
)
) %>%
ggplot(aes(
x = ffi_is_community,
fill = result_malaria
)) +
facet_wrap(vars(malaria)) +
geom_bar(position = "fill", color = "black") +
coord_flip(ylim = c(0, 0.25)) +
scale_y_continuous(
labels = scales::percent_format()
) +
#ggsci::scale_fill_lancet() +
innovar::scale_fill_innova("npr") +
labs(
x = "Communities",
y = "Percentage"
) +
guides(
fill = guide_legend("Results")
) +
theme_minimal() +
theme(
strip.text = element_text(
face = "bold",
size = 11
),
axis.title = element_text(
face = "bold",
size = 11
),
legend.title = element_text(
face = "bold",
size = 11
)
)
plot1

ggsave(
"./02_output/plots/plot1_typeofmalaria_communities.png",
plot1,
dpi = 300,
bg = "white",
width = 10,
height = 9
)
By communities, Indiana and type of plasmodium/time
plot1_indiana <- ffi_total %>%
drop_na(pf_recent:pv_historic) %>%
left_join(
communities_distances
) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
ffi_is_community = str_to_title(ffi_is_community)
) %>%
filter(ffi_is_district == "INDIANA") %>%
mutate(
ffi_is_community = fct_reorder(
ffi_is_community,
distance,
.desc = TRUE
)
) %>%
ggplot(aes(
x = ffi_is_community,
fill = result_malaria
)) +
facet_wrap(vars(malaria)) +
geom_bar(position = "fill", color = "black") +
coord_flip(ylim = c(0, 0.25)) +
scale_y_continuous(
labels = scales::percent_format()
) +
#ggsci::scale_fill_lancet() +
innovar::scale_fill_innova("npr") +
labs(
title = str_wrap("Serological results by plasmodium type of malaria in the Indiana District", 100),
x = "Communities",
y = "Percentage"
) +
guides(
fill = guide_legend("Results")
) +
theme_minimal() +
theme(
strip.text = element_text(
face = "bold",
size = 11
),
axis.title = element_text(
face = "bold",
size = 11
),
legend.title = element_text(
face = "bold",
size = 11
)
)
plot1_indiana

ggsave(
"./02_output/plots/plot1_typeofmalaria_communities_indiana.png",
plot1_indiana,
dpi = 300,
bg = "white",
width = 10,
height = 9
)
By communities, Belen and type of plasmodium/time
plot1_belen <- ffi_total %>%
drop_na(pf_recent:pv_historic) %>%
left_join(
communities_distances
) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
filter(ffi_is_district == "BELEN") %>%
mutate(
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
ffi_is_community = str_to_title(ffi_is_community),
ffi_is_community = fct_reorder(
ffi_is_community,
distance,
.desc = TRUE
)
) %>%
ggplot(aes(
x = ffi_is_community,
fill = result_malaria
)) +
facet_wrap(vars(malaria)) +
geom_bar(position = "fill", color = "black") +
coord_flip(ylim = c(0, 0.25)) +
scale_y_continuous(
labels = scales::percent_format()
) +
#ggsci::scale_fill_lancet() +
innovar::scale_fill_innova("npr") +
labs(
title = str_wrap("Serological results by plasmodium type of malaria in the Belen District", 100),
x = "Communities",
y = "Percentage"
) +
guides(
fill = guide_legend("Results")
) +
theme_minimal() +
theme(
strip.text = element_text(
face = "bold",
size = 11
),
axis.title = element_text(
face = "bold",
size = 11
),
legend.title = element_text(
face = "bold",
size = 11
)
)
plot1_belen

ggsave(
"./02_output/plots/plot1_typeofmalaria_communities_belen.png",
plot1_belen,
dpi = 300,
bg = "white",
width = 10,
height = 9
)
By communities, type of plasmodium exposure
plot2 <- ffi_total %>%
drop_na(pf_exposure, pv_exposure) %>%
left_join(
communities_distances
) %>%
pivot_longer(
cols = pv_exposure:pf_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "pv_exposure" ~ "P. Vivax Exposure",
exposure == "pf_exposure" ~ "P. Falciparum Exposure"
),
ffi_is_community = str_to_title(ffi_is_community),
ffi_is_community = fct_reorder(
ffi_is_community,
distance,
.desc = TRUE
)
) %>%
ggplot(aes(
x = ffi_is_community,
fill = result_exposure
)) +
facet_wrap(vars(exposure)) +
geom_bar(position = "fill", color = "black") +
coord_flip(ylim = c(0, 0.40)) +
scale_y_continuous(
labels = scales::percent_format()
) +
# ggsci::scale_fill_lancet() +
innovar::scale_fill_innova("npr") +
labs(
x = "Communities",
y = "Percentage"
) +
guides(
fill = guide_legend("Results")
) +
theme_minimal() +
theme(
strip.text = element_text(
face = "bold",
size = 11
),
axis.title = element_text(
face = "bold",
size = 11
),
legend.title = element_text(
face = "bold",
size = 11
)
)
plot2

ggsave(
"./02_output/plots/plot2_typeofmalaria_communities.png",
plot2,
dpi = 300,
bg = "white",
width = 10,
height = 9
)
By communities, time of plasmodium exposure
plot3 <- ffi_total %>%
drop_na(recent_exposure, historical_exposure) %>%
left_join(
communities_distances
) %>%
pivot_longer(
cols = recent_exposure:historical_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "recent_exposure" ~ "Recent Exposure",
exposure == "historical_exposure" ~ "Historical Exposure"
),
ffi_is_community = str_to_title(ffi_is_community),
ffi_is_community = fct_reorder(
ffi_is_community,
distance,
.desc = TRUE
)
) %>%
ggplot(aes(
x = ffi_is_community,
fill = result_exposure
)) +
facet_wrap(vars(exposure)) +
geom_bar(position = "fill", color = "black") +
coord_flip(ylim = c(0, 0.30)) +
scale_y_continuous(
labels = scales::percent_format()
) +
# ggsci::scale_fill_lancet() +
innovar::scale_fill_innova("npr") +
labs(
x = "Communities",
y = "Percentage"
) +
guides(
fill = guide_legend("Results")
) +
theme_minimal() +
theme(
strip.text = element_text(
face = "bold",
size = 11
),
axis.title = element_text(
face = "bold",
size = 11
),
legend.title = element_text(
face = "bold",
size = 11
)
)
plot3

ggsave(
"./02_output/plots/plot3_typeofmalaria_communities.png",
plot3,
dpi = 300,
bg = "white",
width = 10,
height = 9
)
# ffi_total %>%
# drop_na(pf_recent:pv_historic, age_cat) %>%
# pivot_longer(
# cols = pf_recent:pv_historic,
# names_to = "malaria",
# values_to = "result_malaria"
# ) %>%
# mutate(
# result_malaria = case_when(
# result_malaria == "Positive" ~ 1,
# TRUE ~ 0
# ),
# malaria = case_when(
# malaria == "pf_recent" ~ "Recent P. Falciparum",
# malaria == "pf_historic" ~ "Historical P. Falciparum",
# malaria == "pv_recent" ~ "Recent P. Vivax",
# malaria == "pv_historic" ~ "Historical P. Vivax"
# ),
# ffi_is_community = str_to_title(ffi_is_community)
# ) %>%
# group_by(ffi_is_community, age_cat, malaria) %>%
# summarise(result_malaria = mean(result_malaria)) %>%
# ggplot(
# aes(
# x = age_cat,
# y = result_malaria,
# color = malaria,
# group = malaria
# )
# ) +
# geom_point() +
# geom_line() +
# facet_wrap(vars(ffi_is_community)) +
# theme_bw()
Seropositivity 4 malaria
By district
sero_4malaria_district <- ffi_total %>%
drop_na(pf_recent:pv_historic, age_cat) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_district, age_cat, malaria) %>%
summarise(result_malaria = mean(result_malaria)) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_wrap(vars(ffi_is_district)) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.40)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district

ggsave(
"./02_output/plots/plot4_sero_4malaria_district.png",
sero_4malaria_district,
dpi = 300,
bg = "white",
width = 12,
height = 7.5
)
By Health Facility
sero_4malaria_hf <- ffi_total %>%
drop_na(pf_recent:pv_historic, age_cat) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
),
ffi_is_health_facility_name = paste(
ffi_is_district,
ffi_is_health_facility_name,
sep = " - "
)
) %>%
group_by(ffi_is_health_facility_name, age_cat, malaria) %>%
summarise(result_malaria = mean(result_malaria)) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_wrap(vars(ffi_is_health_facility_name)) +
scale_y_continuous(
labels = scales::percent_format()
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw() +
theme(
axis.text.x = element_text(
angle = 45,
vjust = 1,
hjust = 1
)
)
sero_4malaria_hf

ggsave(
"./02_output/plots/plot5_sero_4malaria_hf.png",
sero_4malaria_hf,
dpi = 300,
bg = "white",
width = 10,
height = 7
)
Seopositivity by Type of Malaria
By District
ffi_typeof_malaria <- ffi_total %>%
drop_na(pf_exposure, pv_exposure, age_cat) %>%
pivot_longer(
cols = pv_exposure:pf_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "pv_exposure" ~ "P. Vivax Exposure",
exposure == "pf_exposure" ~ "P. Falciparum Exposure"
),
result_exposure = case_when(
result_exposure == "Positive" ~ 1,
TRUE ~ 0
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
)
sero_typeofmalaria_district <- ffi_typeof_malaria %>%
group_by(ffi_is_district, age_cat, exposure) %>%
summarise(result_exposure = mean(result_exposure)) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_wrap(vars(ffi_is_district)) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.40)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
ggsave(
"./02_output/plots/plot6_sero_typeofmalaria_district.png",
sero_typeofmalaria_district,
dpi = 300,
bg = "white",
width = 12,
height = 7.5
)
By Health Facility
sero_typeofmalaria_hf <- ffi_typeof_malaria %>%
group_by(ffi_is_health_facility_name, age_cat, exposure) %>%
summarise(result_exposure = mean(result_exposure)) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_wrap(vars(ffi_is_health_facility_name)) +
scale_y_continuous(
labels = scales::percent_format()
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_hf

ggsave(
"./02_output/plots/plot7_sero_typeofmalaria_hf.png",
sero_typeofmalaria_hf,
dpi = 300,
bg = "white",
width = 13,
height = 9
)
Seropositivity by Time of Exposure
By District
ffi_timeofmalaria <- ffi_total %>%
drop_na(recent_exposure, historical_exposure, age_cat) %>%
pivot_longer(
cols = recent_exposure:historical_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "recent_exposure" ~ "Recent Exposure",
exposure == "historical_exposure" ~ "Historical Exposure"
),
result_exposure = case_when(
result_exposure == "Positive" ~ 1,
TRUE ~ 0
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
)
sero_timeofmalaria_district <- ffi_timeofmalaria %>%
group_by(ffi_is_district, age_cat, exposure) %>%
summarise(result_exposure = mean(result_exposure)) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_wrap(vars(ffi_is_district)) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.40)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
ggsave(
"./02_output/plots/plot8_sero_timeofmalaria_district.png",
sero_timeofmalaria_district,
dpi = 300,
bg = "white",
width = 12,
height = 7.5
)
By Health Facility
sero_timeofmalaria_hf <- ffi_timeofmalaria %>%
group_by(ffi_is_health_facility_name, age_cat, exposure) %>%
summarise(result_exposure = mean(result_exposure)) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_wrap(vars(ffi_is_health_facility_name)) +
scale_y_continuous(
labels = scales::percent_format()
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_hf

ggsave(
"./02_output/plots/plot9_sero_timeofmalaria_hf.png",
sero_timeofmalaria_hf,
dpi = 300,
bg = "white",
width = 13,
height = 9
)
Relation with sex
library(rlang)
seropositivy_summarise <- function(data, type, variable, ...) {
if (type == "4malaria") {
ffi_total %>%
drop_na(pf_recent:pv_historic, {{ variable }}, ...) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_district, {{ variable }}, ..., malaria) %>%
summarise(result_malaria = mean(result_malaria))
} else if (type == "typeofmalaria" ) {
ffi_total %>%
drop_na(pf_exposure, pv_exposure, {{ variable }}, ...) %>%
pivot_longer(
cols = pv_exposure:pf_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "pv_exposure" ~ "P. Vivax Exposure",
exposure == "pf_exposure" ~ "P. Falciparum Exposure"
),
result_exposure = case_when(
result_exposure == "Positive" ~ 1,
TRUE ~ 0
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_district, {{ variable }}, ..., exposure) %>%
summarise(result_exposure = mean(result_exposure))
} else if (type == "timeofmalaria") {
ffi_total %>%
drop_na(recent_exposure, historical_exposure,
{{ variable }}, ...) %>%
pivot_longer(
cols = recent_exposure:historical_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "recent_exposure" ~ "Recent Exposure",
exposure == "historical_exposure" ~ "Historical Exposure"
),
result_exposure = case_when(
result_exposure == "Positive" ~ 1,
TRUE ~ 0
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_district, {{ variable }}, ..., exposure) %>%
summarise(result_exposure = mean(result_exposure))
}
}
By 4 Malaria
sero_4malaria_district_gender <- seropositivy_summarise(
ffi_total,
"4malaria",
age_cat,
gender
) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(gender),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.40)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district_gender

ggsave(
"./02_output/plots/plot10_sero_4malaria_district_gender.png",
sero_4malaria_district_gender,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
sero_typeofmalaria_district_gender <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
gender
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(gender),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.45)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_gender

ggsave(
"./02_output/plots/plot11_sero_typeofmalaria_district_gender.png",
sero_typeofmalaria_district_gender,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_gender <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
gender
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(gender),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.45)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_gender

ggsave(
"./02_output/plots/plot12_sero_timeofmalaria_district_gender.png",
sero_timeofmalaria_district_gender,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Relation with Education Level
By 4 Malaria
sero_4malaria_district_edulevel <- seropositivy_summarise(
ffi_total,
"4malaria",
age_cat,
education_level
) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(education_level),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.40)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district_edulevel

ggsave(
"./02_output/plots/plot13_sero_4malaria_district_edulevel.png",
sero_4malaria_district_edulevel,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
sero_typeofmalaria_district_edulevel <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
education_level
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(education_level),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.45)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_edulevel

ggsave(
"./02_output/plots/plot14_sero_typeofmalaria_district_edulevel.png",
sero_typeofmalaria_district_edulevel,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_edulevel <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
education_level
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(education_level),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.45)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_edulevel

ggsave(
"./02_output/plots/plot15_sero_timeofmalaria_district_edulevel.png",
sero_timeofmalaria_district_edulevel,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Relation with Fever Month
By 4 malaria
ffi_fever_month <- ffi_total %>%
drop_na(pf_recent:pv_historic, age_cat, ffi_is_fever_month) %>%
pivot_longer(
cols = pf_recent:pv_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "pf_recent" ~ "Recent P. Falciparum",
malaria == "pf_historic" ~ "Historical P. Falciparum",
malaria == "pv_recent" ~ "Recent P. Vivax",
malaria == "pv_historic" ~ "Historical P. Vivax"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_fever_month, age_cat, malaria) %>%
summarise(result_malaria = mean(result_malaria))
sero_4malaria_fever_month <- ffi_fever_month %>%
ggplot(
aes(
x = result_malaria,
y = age_cat,
group = age_cat
)
) +
geom_path(
color = "#bdbdbd"
) +
geom_point(
aes(color = malaria),
size = 3
) +
facet_wrap(vars(ffi_is_fever_month)) +
scale_x_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.5)
) +
labs(
y = "Age",
x = "Seropositivity",
title = str_wrap("Malaria seropositivity by type of exposure, plasmodium and presence of fever in the last month", 100)
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
ggsave(
"./02_output/plots/plot16_sero_4malaria_fevermonth.png",
sero_4malaria_fever_month,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
ffi_fever_month_typeofmalaria <- ffi_total %>%
drop_na(pf_recent:pv_historic, age_cat, ffi_is_fever_month) %>%
pivot_longer(
cols = pv_exposure:pf_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "pv_exposure" ~ "P. Vivax Exposure",
exposure == "pf_exposure" ~ "P. Falciparum Exposure"
),
result_exposure = case_when(
result_exposure == "Positive" ~ 1,
TRUE ~ 0
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_fever_month, age_cat, exposure) %>%
summarise(result_exposure = mean(result_exposure))
sero_typeofmalaria_fever_month <- ffi_fever_month_typeofmalaria %>%
ggplot(
aes(
x = result_exposure,
y = age_cat,
group = age_cat
)
) +
geom_path(
color = "#bdbdbd"
) +
geom_point(
aes(color = exposure),
size = 3
) +
facet_wrap(vars(ffi_is_fever_month)) +
scale_x_continuous(
labels = scales::percent_format(),
# limits = c(0, 0.5)
) +
labs(
y = "Age",
x = "Seropositivity",
title = str_wrap("Malaria seropositivity by type of plasmodium and presence of fever in the last month", 100)
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
ggsave(
"./02_output/plots/plot16_sero_typeofmalaria_fevermonth.png",
sero_typeofmalaria_fever_month,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
ffi_fever_month_timeofmalaria <- ffi_total %>%
drop_na(pf_recent:pv_historic, age_cat, ffi_is_fever_month) %>%
pivot_longer(
cols = recent_exposure:historical_exposure,
names_to = "exposure",
values_to = "result_exposure"
) %>%
mutate(
exposure = case_when(
exposure == "recent_exposure" ~ "Recent Exposure",
exposure == "historical_exposure" ~ "Historical Exposure"
),
result_exposure = case_when(
result_exposure == "Positive" ~ 1,
TRUE ~ 0
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_fever_month, age_cat, exposure) %>%
summarise(result_exposure = mean(result_exposure))
sero_timeofmalaria_fever_month <- ffi_fever_month_typeofmalaria %>%
ggplot(
aes(
x = result_exposure,
y = age_cat,
group = age_cat
)
) +
geom_path(
color = "#bdbdbd"
) +
geom_point(
aes(color = exposure),
size = 3
) +
facet_wrap(vars(ffi_is_fever_month)) +
scale_x_continuous(
labels = scales::percent_format(),
# limits = c(0, 0.5)
) +
labs(
y = "Age",
x = "Seropositivity",
title = str_wrap("Malaria seropositivity by time of plasmodium and presence of fever in the last month", 100)
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
ggsave(
"./02_output/plots/plot16_sero_timeofmalaria_fevermonth.png",
sero_timeofmalaria_fever_month,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Relation with Antimalarial Drugs
By 4 Malaria
sero_4malaria_district_antimaldrugs <- seropositivy_summarise(
ffi_total,
"4malaria",
age_cat,
ffi_is_antimal_drug_use
) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_antimal_drug_use),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.50)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district_antimaldrugs

ggsave(
"./02_output/plots/plot19_sero_4malaria_district_antimaldrugs.png",
sero_4malaria_district_antimaldrugs,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
sero_typeofmalaria_district_antimaldrugs <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
ffi_is_antimal_drug_use
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_antimal_drug_use),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.60)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_antimaldrugs

ggsave(
"./02_output/plots/plot20_sero_typeofmalaria_district_antimaldrugs.png",
sero_typeofmalaria_district_antimaldrugs,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_antimaldrugs <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
ffi_is_antimal_drug_use
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_antimal_drug_use),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.5)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_antimaldrugs

ggsave(
"./02_output/plots/plot21_sero_timeofmalaria_district_antimaldrugs.png",
sero_timeofmalaria_district_antimaldrugs,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Relation with time of someone had malaria
By general malaria
ffi_4malaria_mal_lifetime <- ffi_total %>%
drop_na(only_pv_exposure:freedom_malaria,
age_code, ffi_is_mal_lifetime) %>%
pivot_longer(
cols = only_pv_exposure:freedom_malaria,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "only_pv_exposure" ~ "Only P. vivax",
malaria == "only_pf_exposure" ~ "Only P. falciparum",
malaria == "pv_pf_exposure" ~ "P. vivax & falciparum Exposure",
malaria == "freedom_malaria" ~ "Freedom from Malaria"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_mal_lifetime, age_code, malaria) %>%
summarise(result_malaria = mean(result_malaria))
sero_4malaria_mal_lifetime <- ffi_4malaria_mal_lifetime %>%
ggplot(
aes(
x = age_code,
y = result_malaria,
fill = malaria
)
) +
geom_area() +
scale_x_continuous(
limits = c(1, 8),
breaks = seq(1, 8, 1),
labels = c(
"[0-10)",
"[10-20)",
"[20-30)",
"[30-40)",
"[40-50)",
"[50-60)",
"[60-70)",
"[70+)"
),
expand = c(0, 0)
) +
scale_y_continuous(
labels = scales::percent_format(),
expand = c(0, 0)
) +
facet_wrap(vars(ffi_is_mal_lifetime)) +
labs(
y = "Seropositivity",
x = "Age",
title = str_wrap("Malaria seropositivity by type of exposure, plasmodium and how many times they think they have had malaria", 100)
) +
guides(
fill = guide_legend("Malaria")
) +
innovar::scale_fill_innova("npr") +
theme_bw() +
theme(
axis.text.x = element_text(
angle = 45,
vjust = 1,
hjust = 1
),
panel.spacing = unit(1, "lines")
)
sero_4malaria_mal_lifetime

ggsave(
"./02_output/plots/plot22_sero_4ofmalaria_mal_lifetime.png",
sero_4malaria_mal_lifetime,
dpi = 300,
bg = "white",
width = 11,
height = 5
)
By Recent Malaria
ffi_recentmalaria_mal_lifetime <- ffi_total %>%
drop_na(only_pv_recent:freedom_malaria_recent,
age_code, ffi_is_mal_lifetime) %>%
pivot_longer(
cols = only_pv_recent:freedom_malaria_recent,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "only_pv_recent" ~ "Only P. vivax Recent",
malaria == "only_pf_recent" ~ "Only P. falciparum Recent",
malaria == "pv_pf_recent" ~ "P. vivax & falciparum Recent",
malaria == "freedom_malaria_recent" ~ "Freedom from Malaria Recent"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_mal_lifetime, age_code, malaria) %>%
summarise(result_malaria = mean(result_malaria))
sero_recentmalaria_mal_lifetime <- ffi_recentmalaria_mal_lifetime %>%
ggplot(
aes(
x = age_code,
y = result_malaria,
fill = malaria
)
) +
geom_area() +
scale_x_continuous(
limits = c(1, 8),
breaks = seq(1, 8, 1),
labels = c(
"[0-10)",
"[10-20)",
"[20-30)",
"[30-40)",
"[40-50)",
"[50-60)",
"[60-70)",
"[70+)"
),
expand = c(0, 0)
) +
scale_y_continuous(
labels = scales::percent_format(),
expand = c(0, 0)
) +
facet_wrap(vars(ffi_is_mal_lifetime)) +
labs(
y = "Seropositivity",
x = "Age",
title = str_wrap("Malaria seropositivity by recent exposure and how many times they think they have had malaria", 100)
) +
guides(
fill = guide_legend("Malaria")
) +
innovar::scale_fill_innova("npr") +
theme_bw() +
theme(
axis.text.x = element_text(
angle = 45,
vjust = 1,
hjust = 1
),
panel.spacing = unit(1, "lines")
)
sero_recentmalaria_mal_lifetime

ggsave(
"./02_output/plots/plot23_sero_recent_malaria_mal_lifetime.png",
sero_recentmalaria_mal_lifetime,
dpi = 300,
bg = "white",
width = 11,
height = 5
)
By Historic Malaria
ffi_historicmalaria_mal_lifetime <- ffi_total %>%
drop_na(only_pv_historic:freedom_malaria_historic,
age_code, ffi_is_mal_lifetime) %>%
pivot_longer(
cols = only_pv_historic:freedom_malaria_historic,
names_to = "malaria",
values_to = "result_malaria"
) %>%
mutate(
result_malaria = case_when(
result_malaria == "Positive" ~ 1,
TRUE ~ 0
),
malaria = case_when(
malaria == "only_pv_historic" ~ "Only P. vivax Historic",
malaria == "only_pf_historic" ~ "Only P. falciparum Historic",
malaria == "pv_pf_historic" ~ "P. vivax & falciparum Historic",
malaria == "freedom_malaria_historic" ~ "Freedom from Malaria Historic"
),
across(
c(ffi_is_community:ffi_is_health_facility_name),
str_to_title
)
) %>%
group_by(ffi_is_mal_lifetime, age_code, malaria) %>%
summarise(result_malaria = mean(result_malaria))
sero_historicmalaria_mal_lifetime <- ffi_historicmalaria_mal_lifetime %>%
ggplot(
aes(
x = age_code,
y = result_malaria,
fill = malaria
)
) +
geom_area() +
scale_x_continuous(
limits = c(1, 8),
breaks = seq(1, 8, 1),
labels = c(
"[0-10)",
"[10-20)",
"[20-30)",
"[30-40)",
"[40-50)",
"[50-60)",
"[60-70)",
"[70+)"
),
expand = c(0, 0)
) +
scale_y_continuous(
labels = scales::percent_format(),
expand = c(0, 0)
) +
facet_wrap(vars(ffi_is_mal_lifetime)) +
labs(
y = "Seropositivity",
x = "Age",
title = str_wrap("Malaria seropositivity by historic exposure and how many times they think they have had malaria", 100)
) +
guides(
fill = guide_legend("Malaria")
) +
innovar::scale_fill_innova("npr") +
theme_bw() +
theme(
axis.text.x = element_text(
angle = 45,
vjust = 1,
hjust = 1
),
panel.spacing = unit(1, "lines")
)
sero_historicmalaria_mal_lifetime

ggsave(
"./02_output/plots/plot24_sero_historic_malaria_mal_lifetime.png",
sero_historicmalaria_mal_lifetime,
dpi = 300,
bg = "white",
width = 11,
height = 5
)
Relation where someone usually bathe
By 4 Malaria
sero_4malaria_district_ussualybathe<- seropositivy_summarise(
ffi_total,
"4malaria",
age_cat,
ffi_is_place_shower
) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_place_shower),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.50)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district_ussualybathe

ggsave(
"./02_output/plots/plot25_sero_4malaria_district_ussualybathe.png",
sero_4malaria_district_ussualybathe,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
sero_typeofmalaria_district_ussualybathe <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
ffi_is_place_shower
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_place_shower),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.60)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_ussualybathe

ggsave(
"./02_output/plots/plot26_sero_typeofmalaria_district_ussualybathe.png",
sero_typeofmalaria_district_ussualybathe,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_ussualybathe <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
ffi_is_place_shower
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_place_shower),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.5)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_ussualybathe

ggsave(
"./02_output/plots/plot27_sero_timeofmalaria_district_ussualybathe.png",
sero_timeofmalaria_district_ussualybathe,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Relation with those who have a mosquito net
By 4 Malaria
sero_4malaria_district_mosquitnet <- seropositivy_summarise(
ffi_total,
"4malaria",
age_cat,
ffi_is_mosq_net
) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_mosq_net),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.50)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district_mosquitnet

ggsave(
"./02_output/plots/plot28_sero_4malaria_district_mosquitnet.png",
sero_4malaria_district_mosquitnet,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
sero_typeofmalaria_district_mosquitnet <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
ffi_is_mosq_net
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_mosq_net),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.60)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_mosquitnet

ggsave(
"./02_output/plots/plot29_sero_typeofmalaria_district_mosquitnet.png",
sero_typeofmalaria_district_mosquitnet,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_mosquitnet <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
ffi_is_mosq_net
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_mosq_net),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.5)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_mosquitnet

ggsave(
"./02_output/plots/plot30_sero_timeofmalaria_district_mosquitnet.png",
sero_timeofmalaria_district_mosquitnet,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Relation with those who have a trip in the last month
By 4 Malaria
sero_4malaria_district_tripmonth <- seropositivy_summarise(
ffi_total,
"4malaria",
age_cat,
ffi_is_trip_month
) %>%
ggplot(
aes(
x = age_cat,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_trip_month),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.50)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_4malaria_district_tripmonth

ggsave(
"./02_output/plots/plot31_sero_4malaria_district_tripmonth.png",
sero_4malaria_district_tripmonth,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Type of Malaria
sero_typeofmalaria_district_tripmonth <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
ffi_is_trip_month
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_trip_month),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.60)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_tripmonth

ggsave(
"./02_output/plots/plot32_sero_typeofmalaria_district_tripmonth.png",
sero_typeofmalaria_district_tripmonth,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_tripmonth <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
ffi_is_trip_month
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(ffi_is_trip_month),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
#limits = c(0, 0.5)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_tripmonth

ggsave(
"./02_output/plots/plot33_sero_timeofmalaria_district_tripmonth.png",
sero_timeofmalaria_district_tripmonth,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Descriptive 01_data
plot_4_2 <- ffi_total %>%
filter(ffi_is_malaria %in% c("No", "Yes")) %>%
drop_na(age_cat, pv_historic) %>%
mutate(
malaria_gender = paste(gender, ffi_is_malaria)
) %>%
count(pv_historic, age_cat, malaria_gender) %>%
mutate(Percentage = n / sum(n)) %>%
mutate(
Percentage = case_when(
str_detect(malaria_gender, "Female") ~ Percentage * -1,
TRUE ~ Percentage
)
) %>%
ggplot(aes(
y = age_cat,
x = Percentage,
fill = malaria_gender
)) +
geom_col(
position = position_stack(reverse = TRUE),
color = "black"
) +
labs(
x = "Age Group",
y = NULL,
title = "Population structure by age groups, gender and malaria transmission"
) +
facet_wrap(vars(pv_historic)) +
scale_x_continuous(
limits = c(-0.25, 0.25),
breaks = seq(-0.25, 0.25, 0.05),
labels = c(paste0(seq(25, 0, -5), "%"), paste0(seq(5, 25, 5), "%"))
) +
# innovar::scale_fill_innova("npr") +
scale_fill_discrete(
type = innovar::innova_pal("npr")(4),
limits = c("Male Yes", "Male No", "Female No", "Female Yes")
) +
guides(
fill = guide_legend("Have you ever \nhad malaria?")
) +
geom_vline(xintercept = 0, size = 1) +
theme_bw(base_size = 12) +
theme(
plot.title = element_text(
size = 14,
hjust = 0.5,
face = "bold"
),
strip.text = element_text(
size = 12,
face = "bold"
),
legend.title = element_text(
size = 12,
face = "bold"
),
plot.margin = margin(5, 15, 5, 15)
)
Descriptive 01_data
plot_4_2 <- ffi_total %>%
filter(ffi_is_malaria %in% c("No", "Yes")) %>%
drop_na(age_cat, pv_historic) %>%
mutate(
malaria_gender = paste(gender, ffi_is_malaria)
) %>%
count(pv_historic, age_cat, malaria_gender) %>%
mutate(Percentage = n / sum(n)) %>%
mutate(
Percentage = case_when(
str_detect(malaria_gender, "Female") ~ Percentage * -1,
TRUE ~ Percentage
)
) %>%
ggplot(aes(
y = age_cat,
x = Percentage,
fill = malaria_gender
)) +
geom_col(
position = position_stack(reverse = TRUE),
color = "black"
) +
labs(
x = "Age Group",
y = NULL,
title = "Population structure by age groups, gender and malaria transmission"
) +
facet_wrap(vars(pv_historic)) +
scale_x_continuous(
limits = c(-0.25, 0.25),
breaks = seq(-0.25, 0.25, 0.05),
labels = c(paste0(seq(25, 0, -5), "%"), paste0(seq(5, 25, 5), "%"))
) +
# innovar::scale_fill_innova("npr") +
scale_fill_discrete(
type = innovar::innova_pal("npr")(4),
limits = c("Male Yes", "Male No", "Female No", "Female Yes")
) +
guides(
fill = guide_legend("Have you ever \nhad malaria?")
) +
geom_vline(xintercept = 0, size = 1) +
theme_bw(base_size = 12) +
theme(
plot.title = element_text(
size = 14,
hjust = 0.5,
face = "bold"
),
strip.text = element_text(
size = 12,
face = "bold"
),
legend.title = element_text(
size = 12,
face = "bold"
),
plot.margin = margin(5, 15, 5, 15)
)
Sankey_seropositive
library(ggsankey)
ffi_format_sankey <- ffi_total %>%
mutate(
ffi_is_access_malaria_yn_hf = factor(
ffi_is_access_malaria_yn_hf,
label = c("No", "Yes")
),
ffi_is_mal_lifetime = as.character(ffi_is_mal_lifetime),
ffi_is_mal_lifetime = replace_na(ffi_is_mal_lifetime, "0 times"),
ffi_is_mal_lifetime = factor(
ffi_is_mal_lifetime,
labels = c(
"0 times",
"1 to 3 times",
"3 to 7 times",
"More than 7 times"
)
)
)
sankey_seropositive_answ1 <- ffi_format_sankey %>%
pivot_longer(
cols = c(recent_exposure, ffi_is_mal_lifetime, ffi_is_access_malaria_yn_hf),
names_to = "malaria_behavior1",
values_to = "malaria_answ1"
) %>%
count(malaria_behavior1, malaria_answ1) %>%
group_by(malaria_behavior1) %>%
mutate(
percentage = scales::percent(
n / sum(n),
accuracy = 0.1
)
) %>%
ungroup() %>%
mutate(
malaria_behavior1 = fct_relevel(
malaria_behavior1,
"ffi_is_mal_lifetime",
"ffi_is_access_malaria_yn_hf",
"recent_exposure"
),
malaria_percent1 = paste0(
malaria_answ1,
paste0("\n(", percentage, ")")
),
malaria_percent1 = as_factor(malaria_percent1)
) %>%
select(malaria_behavior1, malaria_answ1, malaria_percent1)
sankey_seropositive <- ffi_format_sankey %>%
drop_na(ffi_is_mal_lifetime,
ffi_is_access_malaria_yn_hf,
recent_exposure
) %>%
make_long(
ffi_is_mal_lifetime,
ffi_is_access_malaria_yn_hf,
recent_exposure
) %>%
left_join(
sankey_seropositive_answ1,
by = c(
"x" = "malaria_behavior1",
"node" = "malaria_answ1"
)
) %>%
mutate(
node = malaria_percent1,
node = fct_rev(node)
) %>%
select(-malaria_percent1) %>%
left_join(
sankey_seropositive_answ1,
by = c(
"next_x" = "malaria_behavior1",
"next_node" = "malaria_answ1"
)
) %>%
mutate(next_node = malaria_percent1) %>%
select(-malaria_percent1) %>%
ggplot(aes(
x = x,
next_x = next_x,
node = node,
next_node = next_node,
fill = factor(node),
label = node
)) +
geom_sankey(
flow.alpha = .8,
node.color = "gray30"
) +
geom_sankey_label(size = 4, color = "white", fill = "gray30") +
scale_x_discrete(
labels = str_wrap(
c(
"How many times do you think you have had malaria in your life?",
"If you had malaria, would you go to the health facility?",
"Recent exposure to any type of plasmodium"
),
30
)
) +
theme_sankey(base_size = 18) +
innovar::scale_fill_innova("npr") +
labs(
x = NULL,
title = "Behaviour associated with recent malaria exposure"
) +
theme(
legend.position = "none",
plot.title = element_text(hjust = .5),
plot.margin = margin(5, 5, 5, 5)
)
ggsave("./02_output/plots/plot34_sankey_seropositive.png",
sankey_seropositive,
height = 7,
width = 14,
dpi = 300)
Relation gender and ocupation
By 4 Malaria
sero_4malaria_district_gender_economic <- seropositivy_summarise(
ffi_total,
"4malaria",
economic_activities,
gender
) %>%
ggplot(
aes(
x = economic_activities,
y = result_malaria,
color = malaria,
group = malaria
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(gender),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.40)
) +
labs(
x = "Economic Activities",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw() +
theme(
axis.text.x = element_text(
angle = 45,
vjust = 1,
hjust = 1
)
)
sero_4malaria_district_gender_economic

ggsave(
"./02_output/plots/plot35_sero_4malaria_district_gender_economic.png",
sero_4malaria_district_gender_economic,
dpi = 300,
bg = "white",
width = 11,
height = 7.5,
scale = 0.9
)
By Type of Malaria
sero_typeofmalaria_district_gender <- seropositivy_summarise(
ffi_total,
"typeofmalaria",
age_cat,
gender
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(gender),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.45)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_typeofmalaria_district_gender

ggsave(
"./02_output/plots/plot11_sero_typeofmalaria_district_gender.png",
sero_typeofmalaria_district_gender,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
By Time of Malaria
sero_timeofmalaria_district_gender <- seropositivy_summarise(
ffi_total,
"timeofmalaria",
age_cat,
gender
) %>%
ggplot(
aes(
x = age_cat,
y = result_exposure,
color = exposure,
group = exposure
)
) +
geom_point() +
geom_line() +
facet_grid(
vars(gender),
vars(ffi_is_district)
) +
scale_y_continuous(
labels = scales::percent_format(),
limits = c(0, 0.45)
) +
labs(
x = "Age",
y = "Seropositivity"
) +
guides(
color = guide_legend("Malaria")
) +
innovar::scale_color_innova("npr") +
theme_bw()
sero_timeofmalaria_district_gender

ggsave(
"./02_output/plots/plot12_sero_timeofmalaria_district_gender.png",
sero_timeofmalaria_district_gender,
dpi = 300,
bg = "white",
width = 12,
height = 8.5
)
Maps
library(sf)
library(leaflet)
ffi_total_gps <- ffi_total %>%
select(
ffi_is_cod_com:ffi_is_cod_ind,
pf_recent:pv_historic,
pv_exposure:historical_exposure
) %>%
left_join(
ffi_household %>%
select(
ffi_h_code_community:ffi_h_code_household,
ffi_h_community
),
by = c(
"ffi_is_cod_com" = "ffi_h_code_community",
"ffi_is_cod_household" = "ffi_h_code_household"
)
)
ffi_household_gps <- ffi_total_gps %>%
select(
ffi_is_cod_com:ffi_is_cod_household,
ffi_h_community,
recent_exposure
) %>%
mutate(
recent_exposure = case_when(
recent_exposure == "Positive" ~ 1,
TRUE ~ 0
)
) %>%
group_by(
across(c(ffi_is_cod_com:ffi_h_community))
) %>%
summarise(
recent_exposure = mean(recent_exposure)
) %>%
ungroup()
# mutate(
# color_marker = case_when(
# recent_exposure == 0 ~ "red",
# TRUE ~ "black"
# )
# )
ffi_household_gps <- ffi_household_gps %>%
left_join(
ffi_household %>%
select(
ffi_h_code_community:ffi_h_code_household,
ffi_h_district,
ffi_gps_long,
ffi_gps_lat
),
by = c(
"ffi_is_cod_com" = "ffi_h_code_community",
"ffi_is_cod_household" = "ffi_h_code_household"
)
) %>%
mutate(
ffi_h_household_id = paste0(ffi_is_cod_com, ffi_is_cod_household),
ffi_is_cod_com_label = paste0(
"Cod: ",
ffi_is_cod_household,
" - ",
str_to_title(ffi_h_community),
" (",
str_to_title(ffi_h_district),
")"
)
) %>%
st_as_sf(
coords = c("ffi_gps_long", "ffi_gps_lat"),
crs = 4326
)
# colors_pal <- rev(innovar:::innova_palettes[["ecomst"]])
# pal <- colorNumeric(
# colorRamp(colors_pal),
# ffi_household_gps$recent_exposure
# )
pal <- colorNumeric(
hcl.colors(17, palette = "zissou"),
ffi_household_gps$recent_exposure
)
# icons_household <- awesomeIcons(
# icon = "ios-home",
# iconColor = "black",
# library = "ion",
# markerColor = innovar::innova_pal("ecomst", reverse = TRUE)(17)
# )
communities_sf <- communities_sf %>%
mutate(
ffi_h_community = str_to_title(ffi_h_community)
) %>%
left_join(
ffi_household %>%
select(ffi_h_district, ffi_h_code_community) %>%
distinct()
) %>%
mutate(
ffi_h_community_label = paste0(
ffi_h_community,
" (",
str_to_title(ffi_h_district),
")"
)
)
household_communities_leaft <- ffi_household_gps %>%
leaflet() %>%
addProviderTiles(
providers$OpenStreetMap,
group = "OpenStreetMap"
) %>%
addCircleMarkers(
layerId = ~ffi_h_household_id,
label = ~ffi_is_cod_com_label,
color = ~ pal(recent_exposure),
group = "Households",
radius = 7,
weight = 5,
opacity = 1,
fillOpacity = 0.1,
labelOptions = labelOptions(
style = list(
"font-weight" = "bold",
padding = "3px 8px"
),
textsize = "12px",
direction = "auto"
)
) %>%
# addLegend(
# title = "Recent Exposure",
# pal = pal,
# values = ~ recent_exposure,
# group = "circles",
# position = "bottomleft",
# transform = ~ scales::percent_format(),
# opacity = 1
# ) %>%<font-awesome-icon icon="fa-solid fa-location-dot" />
leaflegend::addLegendNumeric(
title = "Recent Exposure",
pal = pal,
values = ~ recent_exposure,
position = "bottomright",
orientation = "horizontal",
height = 20,
width = 100,
decreasing = FALSE,
numberFormat = scales::percent_format(),
group = "circles"
) %>%
addAwesomeMarkers(
data = communities_sf,
layerId = ~ffi_h_code_community,
label = ~ffi_h_community_label,
group = "Communities"
) %>%
addProviderTiles(
providers$OpenStreetMap,
group = "OpenStreetMap"
) %>%
addTiles(
urlTemplate = "http://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga",
attribution = "Google Maps",
options = leaflet::tileOptions(
maxNativeZoom = 19,
maxZoom = 20
),
group = "Google Maps"
) %>%
addTiles(
urlTemplate = "https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",
attribution = "Satellite View",
options = leaflet::tileOptions(
maxNativeZoom = 19,
maxZoom = 20
),
group = "Satellite View"
) %>%
# Layers control*
addLayersControl(
overlayGroups = c("Households", "Communities"),
baseGroups = c("OpenStreetMap", "Google Maps", "Satellite View"),
options = layersControlOptions(collapsed = FALSE)
) %>%
# addLegend(
# "topright",
# pal = innovar::innova_pal("ecomst", reverse = TRUE)(980)
# ) %>%
# addLegend(
# position = "bottomright",
# colors = c(
# "white; width:15px; height:15px;
# border:5px solid red; border-radius:50%;",
# "white; width:7.5px; height:7.5px; margin-top: 5px;
# border:5px solid black; border-radius:50%; margin-left:2px;"
# ),
# labels = c(
# "<div style='display: inline-block; height: 10px;
# margin-top: 8px;line-height: 10px;font-weight: bold;
# color: black; '>At least 1 person with recent malaria</div>",
# "<div style='display: inline-block;height: 10px;
# margin-top: 8px;line-height: 10px;font-weight: bold;
# color: black; margin-top: 10px;
# margin-left:5px'>No one with recent malaria at household</div>"
# ),
# opacity = 1
# ) %>%
leaflet.extras::addResetMapButton()
household_communities_leaft
htmlwidgets::saveWidget(
household_communities_leaft,
file = "./02_output/plots/household_communities_leaft.html"
)
webshot::webshot(
"./02_output/plots/household_communities_leaft.html",
"./02_output/plots/household_communities_leaft.png",
cliprect = "viewport",
zoom = 4
)
LS0tCnRpdGxlOiAiRGVzY3JpcHRpdmUgYW5hbHlzaXMiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBybWRmb3JtYXRzOjpkb3duY3V0ZToKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBoaWdobGlnaHQ6IGthdGUKICAgIHRvY19kZXB0aDogMwogICAgZGVmYXVsdF9zdHlsZTogZGFyawogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBoaWdobGlnaHRfZG93bmxpdDogdHJ1ZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyMgR2xvYmFsIG9wdGlvbnMKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGNhY2hlID0gVFJVRSwKICB3YXJuaW5nID0gRkFMU0UsCiAgbWVzc2FnZSA9IEZBTFNFCikKCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGdnc2ZsYWJlbCkKYGBgCgojIEltcG9ydCBkYXRhCgpgYGB7cn0Kc2Vyb2xvZ3kgPC0gcmVhZF9jc3YoIi4vMDFfZGF0YS9yYXcvRkZJLnBlcnUuc2Vyb2xvZ3kua21lYW5zMi5jc3YiKSAlPiUKICByZW5hbWUoZmZpX2lzX2NvZGUgPSBDb2RpZ28pICU+JQogIHNlbGVjdCgtMSkKCmZmaV9pbmRpdmlkdWFsIDwtIHJlYWRfY3N2KCIuLzAxX2RhdGEvcmF3L2luZGl2aWR1YWxzX3Jlc3VsdF9zaGFyZV8wNzIwMjIuY3N2IikKZmZpX2hvdXNlaG9sZCA8LSByZWFkX2NzdigiLi8wMV9kYXRhL3Jhdy9ob3VzZWhvbGRfZ3BzX3NoYXJlXzA3MjAyMi5jc3YiKQpkYXRhXzIwMDBfMjAxOSA8LSByZWFkX2NzdigiLi8wMV9kYXRhL3Jhdy9EYXRhX0ZGSV8yMDAwXzIwMTlfMjAyMTI0MDUuY3N2IikKZGF0YV8yMDIwXzIwMjEgPC0gcmVhZF9jc3YoIi4vMDFfZGF0YS9yYXcvRGF0YV9GRklfMjAyMF8yMDIxXzIwMjEwNjI5LmNzdiIpCnBvYmxhY2lvbiA8LSByZWFkUkRTKCIuLzAxX2RhdGEvcmF3L3BvYmxhY2lvbl9pbmVpXzIwMTcucmRzIikKYGBgCgojIEZvcm1hdCBkYXRhCgpgYGB7cn0KZmZpX3RvdGFsIDwtIGZmaV9pbmRpdmlkdWFsICU+JQogIGZ1bGxfam9pbigKICAgIHNlcm9sb2d5ICU+JQogICAgICBtdXRhdGUoCiAgICAgICAgZmZpX2lzX2NvZGUgPSBwYXN0ZTAoMCwgZmZpX2lzX2NvZGUpCiAgICAgICksCiAgICBieSA9ICJmZmlfaXNfY29kZSIKICApCgpmZmlfdG90YWwgPC0gZmZpX3RvdGFsICU+JQogIG11dGF0ZSgKICAgIGFnZV9jYXQgPSBjYXNlX3doZW4oCiAgICAgIGZmaV9pc19hZ2VfZml4ZWQgPj0gNzAgfiAiWzcwKykiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDYwIH4gIls2MC03MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDUwIH4gIls1MC02MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDQwIH4gIls0MC01MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDMwIH4gIlszMC00MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDIwIH4gIlsyMC0zMCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDEwIH4gIlsxMC0yMCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDAgfiAiWzAtMTApIgogICAgKSwKICAgIGFnZV9jYXQgPSBmYWN0b3IoYWdlX2NhdCksCiAgICBhZ2VfY29kZSA9IGNhc2Vfd2hlbigKICAgICAgYWdlX2NhdCA9PSAiWzcwKykiIH4gOCwKICAgICAgYWdlX2NhdCA9PSAiWzYwLTcwKSIgfiA3LAogICAgICBhZ2VfY2F0ID09ICJbNTAtNjApIiB+IDYsCiAgICAgIGFnZV9jYXQgPT0gIls0MC01MCkiIH4gNSwKICAgICAgYWdlX2NhdCA9PSAiWzMwLTQwKSIgfiA0LAogICAgICBhZ2VfY2F0ID09ICJbMjAtMzApIiB+IDMsCiAgICAgIGFnZV9jYXQgPT0gIlsxMC0yMCkiIH4gMiwKICAgICAgYWdlX2NhdCA9PSAiWzAtMTApIiB+IDEsCiAgICApLAogICAgZ2VuZGVyID0gZmFjdG9yKAogICAgICBmZmlfaXNfc2V4LAogICAgICBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpCiAgICApLAogICAgZmZpX2lzX21hbGFyaWEgPSBmYWN0b3IoCiAgICAgIGZmaV9pc19tYWxhcmlhLAogICAgICBsYWJlbHMgPSBjKCJObyIsICJZZXMiLCAiRG9uJ3QgS25vdyAvIE5vIEFuc3dlciIpCiAgICApLAogICAgYWNyb3NzKAogICAgICBjKHBmX3JlY2VudDpwdl9oaXN0b3JpYyksCiAgICAgIH4gZmFjdG9yKC4sIGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIikpCiAgICApLAogICAgYWNyb3NzKAogICAgICBjKAogICAgICAgIGZmaV9pc19mZXZlcl9tb250aCwKICAgICAgICBmZmlfaXNfYW50aW1hbF9kcnVnX3VzZSwgCiAgICAgICAgZmZpX2lzX21vc3FfbmV0CiAgICAgICksCiAgICAgIH4gZmFjdG9yKC4sIGxhYmVscyA9IGMoIk5vIiwgIlllcyIpKQogICAgKSwKICAgIGZmaV9pc190cmlwX21vbnRoID0gZmFjdG9yKAogICAgICBmZmlfaXNfdHJpcF9tb250aCwKICAgICAgbGFiZWxzID0gYygiTm8iLCAiWWVzIiwgIkRvbid0IEtub3cvTm8gQW5zd2VyIikKICAgICksCiAgICBmZmlfaXNfbWFsX2xpZmV0aW1lID0gZmFjdG9yKAogICAgICBmZmlfaXNfbWFsX2xpZmV0aW1lLAogICAgICBsYWJlbHMgPSBjKAogICAgICAgICIxIHRvIDMgdGltZXMiLAogICAgICAgICIzIHRvIDcgdGltZXMiLAogICAgICAgICJNb3JlIHRoYW4gNyB0aW1lcyIKICAgICAgKQogICAgKSwKICAgIGZmaV9pc19wbGFjZV9zaG93ZXIgPSBmYWN0b3IoCiAgICAgIGZmaV9pc19wbGFjZV9zaG93ZXIsCiAgICAgIGxhYmVscyA9IGMoCiAgICAgICAgIkJhdGhyb29tIGluc2lkZSB0aGUgZHdlbGxpbmciLAogICAgICAgICJCYXRocm9vbSBvdXRzaWRlIHRoZSBkd2VsbGluZyIsCiAgICAgICAgIkluIHRoZSBjb3VudHJ5c2lkZS9yaXZlciIsCiAgICAgICAgIk90aGVyIgogICAgICApCiAgICApLAogICAgZWR1Y2F0aW9uX2xldmVsID0gY2FzZV93aGVuKAogICAgICBmZmlfaXNfaW5zdF9sZXZlbCAlaW4lIDAgfiAiTm8gc2Nob29saW5nIiwgCiAgICAgIGZmaV9pc19pbnN0X2xldmVsICVpbiUgMToyIH4gIlByaW1hcnkgc2Nob29sIiwKICAgICAgZmZpX2lzX2luc3RfbGV2ZWwgJWluJSAzOjQgfiAiU2Vjb25kYXJ5IHNjaG9vbCIsCiAgICAgIGZmaV9pc19pbnN0X2xldmVsICVpbiUgNTo2IH4gIkhpZ2hlciBlZHVjYXRpb24iCiAgICApLAogICAgZWR1Y2F0aW9uX2xldmVsID0gZmN0X3JlbGV2ZWwoZWR1Y2F0aW9uX2xldmVsLCAiTm8gc2Nob29saW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltYXJ5IHNjaG9vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5IHNjaG9vbCIpLAogICAgZWNvbm9taWNfYWN0aXZpdGllcyA9IGZhY3RvcihmZmlfaXNfbWFpbl9lY29uX2FjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRGF5IGxhYm91cmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV29vZCBleHRyYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXNoZXJtYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaXZlc3RvY2sgZmFybWVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFybWVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG91c2V3aWZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3R1ZGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vdG9yY3ljbGUgdGF4aSBkcml2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKSksCiAgICBwdl9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcHZfcmVjZW50ID09ICJOZWdhdGl2ZSIgJiBwdl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiIH4gIk5lZ2F0aXZlIiwKICAgICAgaXMubmEocHZfcmVjZW50KSAmIGlzLm5hKHB2X2hpc3RvcmljKSB+IE5BX2NoYXJhY3Rlcl8sCiAgICAgIFRSVUUgfiAiUG9zaXRpdmUiCiAgICApLAogICAgcGZfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHBmX3JlY2VudCA9PSAiTmVnYXRpdmUiICYgcGZfaGlzdG9yaWMgPT0gIk5lZ2F0aXZlIiB+ICJOZWdhdGl2ZSIsCiAgICAgIGlzLm5hKHBmX3JlY2VudCkgJiBpcy5uYShwZl9oaXN0b3JpYykgfiBOQV9jaGFyYWN0ZXJfLAogICAgICBUUlVFIH4gIlBvc2l0aXZlIgogICAgKSwKICAgIHJlY2VudF9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcHZfcmVjZW50ID09ICJOZWdhdGl2ZSIgJiBwZl9yZWNlbnQgPT0gIk5lZ2F0aXZlIiB+ICJOZWdhdGl2ZSIsCiAgICAgIGlzLm5hKHB2X3JlY2VudCkgJiBpcy5uYShwZl9yZWNlbnQpIH4gTkFfY2hhcmFjdGVyXywKICAgICAgVFJVRSB+ICJQb3NpdGl2ZSIKICAgICksCiAgICBoaXN0b3JpY2FsX2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBwdl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiICYgcGZfaGlzdG9yaWMgPT0gIk5lZ2F0aXZlIiB+ICJOZWdhdGl2ZSIsCiAgICAgIGlzLm5hKHB2X2hpc3RvcmljKSAmIGlzLm5hKHBmX2hpc3RvcmljKSB+IE5BX2NoYXJhY3Rlcl8sCiAgICAgIFRSVUUgfiAiUG9zaXRpdmUiCiAgICApLAogICAgb25seV9wdl9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcHZfZXhwb3N1cmUgPT0gIlBvc2l0aXZlIiAmIHBmX2V4cG9zdXJlID09ICJOZWdhdGl2ZSIgfiAiUG9zaXRpdmUiLCAKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBvbmx5X3BmX2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBwZl9leHBvc3VyZSA9PSAiUG9zaXRpdmUiICYgcHZfZXhwb3N1cmUgPT0gIk5lZ2F0aXZlIiB+ICJQb3NpdGl2ZSIsIAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIHB2X3BmX2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBwdl9leHBvc3VyZSA9PSAiUG9zaXRpdmUiICYgcGZfZXhwb3N1cmUgPT0gIlBvc2l0aXZlIiB+ICJQb3NpdGl2ZSIsCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgZnJlZWRvbV9tYWxhcmlhID0gY2FzZV93aGVuKAogICAgICBwdl9leHBvc3VyZSA9PSAiTmVnYXRpdmUiICYgcGZfZXhwb3N1cmUgPT0gIk5lZ2F0aXZlIiB+ICJQb3NpdGl2ZSIsIAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIG9ubHlfcHZfcmVjZW50ID0gY2FzZV93aGVuKAogICAgICBwdl9yZWNlbnQgPT0gIlBvc2l0aXZlIiAmIHBmX3JlY2VudCA9PSAiTmVnYXRpdmUiIH4gIlBvc2l0aXZlIiwgCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgb25seV9wZl9yZWNlbnQgPSBjYXNlX3doZW4oCiAgICAgIHBmX3JlY2VudCA9PSAiUG9zaXRpdmUiICYgcHZfcmVjZW50ID09ICJOZWdhdGl2ZSIgfiAiUG9zaXRpdmUiLCAKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBwdl9wZl9yZWNlbnQgPSBjYXNlX3doZW4oCiAgICAgIHB2X3JlY2VudCA9PSAiUG9zaXRpdmUiICYgcGZfcmVjZW50ID09ICJQb3NpdGl2ZSIgfiAiUG9zaXRpdmUiLAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIGZyZWVkb21fbWFsYXJpYV9yZWNlbnQgPSBjYXNlX3doZW4oCiAgICAgIHB2X3JlY2VudCA9PSAiTmVnYXRpdmUiICYgcGZfcmVjZW50ID09ICJOZWdhdGl2ZSIgfiAiUG9zaXRpdmUiLCAKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBvbmx5X3B2X2hpc3RvcmljID0gY2FzZV93aGVuKAogICAgICBwdl9oaXN0b3JpYyA9PSAiUG9zaXRpdmUiICYgcGZfaGlzdG9yaWMgPT0gIk5lZ2F0aXZlIiB+ICJQb3NpdGl2ZSIsIAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIG9ubHlfcGZfaGlzdG9yaWMgPSBjYXNlX3doZW4oCiAgICAgIHBmX2hpc3RvcmljID09ICJQb3NpdGl2ZSIgJiBwdl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiIH4gIlBvc2l0aXZlIiwgCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgcHZfcGZfaGlzdG9yaWMgPSBjYXNlX3doZW4oCiAgICAgIHB2X2hpc3RvcmljID09ICJQb3NpdGl2ZSIgJiBwZl9oaXN0b3JpYyA9PSAiUG9zaXRpdmUiIH4gIlBvc2l0aXZlIiwKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBmcmVlZG9tX21hbGFyaWFfaGlzdG9yaWMgPSBjYXNlX3doZW4oCiAgICAgIHB2X2hpc3RvcmljID09ICJOZWdhdGl2ZSIgJiBwZl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiIH4gIlBvc2l0aXZlIiwgCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgYWNyb3NzKGMocHZfZXhwb3N1cmU6ZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljKSwgZmFjdG9yKQogICkKCmxhYmVsbGVkOjp2YXJfbGFiZWwoZmZpX3RvdGFsKSA8LSBsaXN0KAogIGZmaV9pc19kaXN0cmljdCA9ICJEaXN0cmljcyIsCiAgZ2VuZGVyID0gIkdlbmRlciIsCiAgYWdlX2NhdCA9ICJBZ2UiLAogIGVkdWNhdGlvbl9sZXZlbCA9ICJFZHVjYXRpb24gTGV2ZWwiLAogIGVjb25vbWljX2FjdGl2aXRpZXMgPSAiRWNvbm9taWMgQWN0aXZpdGllcyIsCiAgcGZfcmVjZW50ID0gIlJlY2VudCBQLiBGYWxjaXBhcnVtIiwKICBwZl9oaXN0b3JpYyA9ICJIaXN0b3JpY2FsIFAuIEZhbGNpcGFydW0iLAogIHB2X3JlY2VudCA9ICJSZWNlbnQgUC4gVml2YXgiLAogIHB2X2hpc3RvcmljID0gIkhpc3RvcmljYWwgUC4gVml2YXgiLAogIHB2X2V4cG9zdXJlID0gIlAuIFZpdmF4IEV4cG9zdXJlIiwKICBwZl9leHBvc3VyZSA9ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgopCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQpzYXZlUkRTKGZmaV90b3RhbCwgCiAgICAgICAgZmlsZSA9ICIwMV9kYXRhL3Byb2Nlc3NlZC9mZmlfdG90YWwucmRzIikKYGBgCgojIFRhYmxlIGRlc2NyaXB0aXZlCgpgYGB7cn0KbGlicmFyeShndHN1bW1hcnkpCgpmaXNoZXIudGVzdC5zaW11bGF0ZS5wLnZhbHVlcyA8LSBmdW5jdGlvbihkYXRhLCB2YXJpYWJsZSwgYnksIC4uLikgewogIHJlc3VsdCA8LSBsaXN0KCkKICB0ZXN0X3Jlc3VsdHMgPC0gc3RhdHM6OmZpc2hlci50ZXN0KGRhdGFbW3ZhcmlhYmxlXV0sIGRhdGFbW2J5XV0sIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKQogIHJlc3VsdCRwIDwtIHRlc3RfcmVzdWx0cyRwLnZhbHVlCiAgcmVzdWx0JHRlc3QgPC0gdGVzdF9yZXN1bHRzJG1ldGhvZAogIHJlc3VsdAp9CmBgYAoKIyMgVGFibGUgZm9yIGRpc3RyaWN0CgpgYGB7cn0KdGFibGVfMSA8LSBmZmlfdG90YWwgJT4lCiAgc2VsZWN0KAogICAgZmZpX2lzX2Rpc3RyaWN0LAogICAgZ2VuZGVyLAogICAgYWdlX2NhdCwKICAgIGVkdWNhdGlvbl9sZXZlbCwKICAgIGVjb25vbWljX2FjdGl2aXRpZXMsCiAgICBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMKICApICU+JQogIHRibF9zdW1tYXJ5KAogICAgYnkgPSAiZmZpX2lzX2Rpc3RyaWN0IiwKICAgIG1pc3NpbmdfdGV4dCA9ICJNaXNzaW5nIgogICkgJT4lCiAgYWRkX24oKSAlPiUKICBhZGRfb3ZlcmFsbCgpICU+JQogIGFkZF9wKAogICAgIHRlc3QgPSBsaXN0KGFsbF9jYXRlZ29yaWNhbCgpIH4gImZpc2hlci50ZXN0LnNpbXVsYXRlLnAudmFsdWVzIikKICApICU+JSAKICBib2xkX3AoKSAlPiUKICBtb2RpZnlfaGVhZGVyKGxhYmVsID0gIioqVmFyaWFibGUqKiIpICU+JQogIGJvbGRfbGFiZWxzKCkKICAKdGFibGUxCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KdGFibGVfMSAlPiUKICBhc19mbGV4X3RhYmxlKCkgJT4lCiAgZmxleHRhYmxlOjpzYXZlX2FzX2RvY3gocGF0aCA9ICIuLzAyX291dHB1dC9yZXBvcnRzL3RhYmxlMS5kb2N4IikKYGBgCgojIyBUYWJsZSBmb3IgUGxhc21vZGl1bQpgYGB7cn0KIHRhYmxlMiA8LSBmZmlfdG90YWwgJT4lCiAgIHNlbGVjdCgKICAgICBnZW5kZXIsCiAgICAgYWdlX2NhdCwKICAgICBlZHVjYXRpb25fbGV2ZWwsCiAgICAgZWNvbm9taWNfYWN0aXZpdGllcywKICAgICBwZl9leHBvc3VyZSwKICAgICBwdl9leHBvc3VyZQogICApICU+JQogICBkcm9wX25hKHBmX2V4cG9zdXJlLCBwdl9leHBvc3VyZSkgJT4lCiAgIHBpdm90X2xvbmdlcigKICAgICBjb2xzID0gcHZfZXhwb3N1cmU6cGZfZXhwb3N1cmUsCiAgICAgbmFtZXNfdG8gPSAiZXhwb3N1cmUiLAogICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgICkgJT4lCiAgIG11dGF0ZSgKICAgIGV4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBleHBvc3VyZSA9PSAicHZfZXhwb3N1cmUiIH4gIlAuIFZpdmF4IEV4cG9zdXJlIiwKICAgICAgZXhwb3N1cmUgPT0gInBmX2V4cG9zdXJlIiB+ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgogICAgKQogICApICU+JQogICB0Ymxfc3RyYXRhKAogICAgc3RyYXRhID0gZXhwb3N1cmUsCiAgICAudGJsX2Z1biA9CiAgICAgIH4gLnggJT4lCiAgICAgICAgICB0Ymxfc3VtbWFyeSgKICAgICAgICAgICAgYnkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgICAgICAgIG1pc3NpbmdfdGV4dCA9ICJNaXNzaW5nIgogICAgICAgICAgKSAlPiUKICAgICAgICAgIGFkZF9wKAogICAgICAgICAgICB0ZXN0ID0gbGlzdChhbGxfY2F0ZWdvcmljYWwoKSB+ICJmaXNoZXIudGVzdC5zaW11bGF0ZS5wLnZhbHVlcyIpCiAgICAgICAgICApICU+JQogICAgICAgICAgYm9sZF9wKCkgJT4lCiAgICAgICAgICBtb2RpZnlfaGVhZGVyKGxhYmVsID0gIioqVmFyaWFibGUqKiIpICU+JQogICAgICAgICAgYm9sZF9sYWJlbHMoKSAKICAgKSAKCnRhYmxlMl9vdmVyYWxsIDwtIGZmaV90b3RhbCAlPiUKICBzZWxlY3QoCiAgICBnZW5kZXIsCiAgICBhZ2VfY2F0LAogICAgZWR1Y2F0aW9uX2xldmVsLAogICAgZWNvbm9taWNfYWN0aXZpdGllcywKICAgIHBmX2V4cG9zdXJlLAogICAgcHZfZXhwb3N1cmUKICApICU+JQogIGRyb3BfbmEocGZfZXhwb3N1cmUsIHB2X2V4cG9zdXJlKSAlPiUKICB0Ymxfc3VtbWFyeSgKICAgIG1pc3NpbmdfdGV4dCA9ICJNaXNzaW5nIgogICkgJT4lCiAgbW9kaWZ5X2hlYWRlcigKICAgIGxhYmVsID0gIioqVmFyaWFibGUqKiIKICApICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgbW9kaWZ5X3NwYW5uaW5nX2hlYWRlcihzdGF0XzAgfiAiKipPdmVyYWxsKioiKQoKdGFibGUyIDwtIHRibF9tZXJnZSgKICB0YmxzID0gbGlzdCh0YWJsZTIsIHRhYmxlMl9vdmVyYWxsKSwKICB0YWJfc3Bhbm5lciA9IEZBTFNFCikKCnRhYmxlMgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9CnRhYmxlMiAlPiUKICBhc19mbGV4X3RhYmxlKCkgJT4lCiAgZmxleHRhYmxlOjpzYXZlX2FzX2RvY3gocGF0aCA9ICIuLzAyX291dHB1dC9yZXBvcnRzL3RhYmxlMi5kb2N4IikKYGBgCgojIyBUYWJsZSBmb3IgRXhwb3N1cmUgVGltZQoKYGBge3J9CiB0YWJsZTMgPC0gZmZpX3RvdGFsICU+JQogICBzZWxlY3QoCiAgICAgZ2VuZGVyLAogICAgIGFnZV9jYXQsCiAgICAgZWR1Y2F0aW9uX2xldmVsLAogICAgIGVjb25vbWljX2FjdGl2aXRpZXMsCiAgICAgcmVjZW50X2V4cG9zdXJlLAogICAgIGhpc3RvcmljYWxfZXhwb3N1cmUKICAgKSAlPiUKICAgZHJvcF9uYShyZWNlbnRfZXhwb3N1cmUsIGhpc3RvcmljYWxfZXhwb3N1cmUpICU+JQogICBwaXZvdF9sb25nZXIoCiAgICAgY29scyA9IHJlY2VudF9leHBvc3VyZTpoaXN0b3JpY2FsX2V4cG9zdXJlLAogICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X2V4cG9zdXJlIgogICApICU+JQogICBtdXRhdGUoCiAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgZXhwb3N1cmUgPT0gInJlY2VudF9leHBvc3VyZSIgfiAiUmVjZW50IEV4cG9zdXJlIiwKICAgICAgZXhwb3N1cmUgPT0gImhpc3RvcmljYWxfZXhwb3N1cmUiIH4gIkhpc3RvcmljYWwgRXhwb3N1cmUiCiAgICApCiAgICkgJT4lCiAgIHRibF9zdHJhdGEoCiAgICBzdHJhdGEgPSBleHBvc3VyZSwKICAgIC50YmxfZnVuID0KICAgICAgfiAueCAlPiUKICAgICAgICAgIHRibF9zdW1tYXJ5KAogICAgICAgICAgICBieSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgICAgICAgbWlzc2luZ190ZXh0ID0gIk1pc3NpbmciCiAgICAgICAgICApICU+JQogICAgICAgICAgYWRkX3AoCiAgICAgICAgICAgIHRlc3QgPSBsaXN0KGFsbF9jYXRlZ29yaWNhbCgpIH4gImZpc2hlci50ZXN0LnNpbXVsYXRlLnAudmFsdWVzIikKICAgICAgICAgICkgJT4lCiAgICAgICAgICBib2xkX3AoKSAlPiUKICAgICAgICAgIG1vZGlmeV9oZWFkZXIobGFiZWwgPSAiKipWYXJpYWJsZSoqIikgJT4lCiAgICAgICAgICBib2xkX2xhYmVscygpIAogICApIAoKdGFibGUzX292ZXJhbGwgPC0gZmZpX3RvdGFsICU+JQogIHNlbGVjdCgKICAgIGdlbmRlciwKICAgIGFnZV9jYXQsCiAgICBlZHVjYXRpb25fbGV2ZWwsCiAgICBlY29ub21pY19hY3Rpdml0aWVzLAogICAgcmVjZW50X2V4cG9zdXJlLAogICAgaGlzdG9yaWNhbF9leHBvc3VyZQogICkgJT4lCiAgZHJvcF9uYShyZWNlbnRfZXhwb3N1cmUsIGhpc3RvcmljYWxfZXhwb3N1cmUpICU+JQogIHRibF9zdW1tYXJ5KAogICAgbWlzc2luZ190ZXh0ID0gIk1pc3NpbmciCiAgKSAlPiUKICBtb2RpZnlfaGVhZGVyKAogICAgbGFiZWwgPSAiKipWYXJpYWJsZSoqIgogICkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBtb2RpZnlfc3Bhbm5pbmdfaGVhZGVyKHN0YXRfMCB+ICIqKk92ZXJhbGwqKiIpCgp0YWJsZTMgPC0gdGJsX21lcmdlKAogIHRibHMgPSBsaXN0KHRhYmxlMywgdGFibGUzX292ZXJhbGwpLAogIHRhYl9zcGFubmVyID0gRkFMU0UKKQoKdGFibGUzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KdGFibGUzICU+JQogIGFzX2ZsZXhfdGFibGUoKSAlPiUKICBmbGV4dGFibGU6OnNhdmVfYXNfZG9jeChwYXRoID0gIi4vMDJfb3V0cHV0L3JlcG9ydHMvdGFibGUzLmRvY3giKQpgYGAKCgojIERpc3RhbmNlIGNvbW11bml0aWVzIGFuZCByZWdpb25hbCBIb3NwaXRhbAoKYGBge3J9CmlxdWl0b3NfY2VudHJvIDwtIHRpYmJsZSgKICAiZmZpX2hfaGVhbHRoX2ZhY2lsaXR5X25hbWUiID0gIkhvc3BpdGFsIFJlZ2lvbmFsIGRlIExvcmV0byIsCiAgTG9uZ2l0dWRlID0gLTczLjI1Mzg1OTAyMDgwOTA2LAogIExhdGl0dWRlID0gLTMuNzI2NDA2MDE2NDE0ODcxNiwKKSAlPiUKICBzdF9hc19zZihjb29yZHMgPSBjKCJMb25naXR1ZGUiLCAiTGF0aXR1ZGUiKSwgY3JzID0gNDMyNikgJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDMyNzE4KQoKY29tbXVuaXRpZXNfc2YgPC0gZmZpX2hvdXNlaG9sZCAlPiUKICBzZWxlY3QoCiAgICBmZmlfaF9kaXN0cmljdCwKICAgIGZmaV9oX2NvZGVfY29tbXVuaXR5LAogICAgZmZpX2hfY29tbXVuaXR5LAogICAgZmZpX2dwc19sb25nLAogICAgZmZpX2dwc19sYXQKICApICU+JQogIHN0X2FzX3NmKAogICAgY29vcmRzID0gYygiZmZpX2dwc19sb25nIiwgImZmaV9ncHNfbGF0IiksCiAgICBjcnMgPSA0MzI2CiAgKSAlPiUKICBncm91cF9ieShmZmlfaF9kaXN0cmljdCwgZmZpX2hfY29kZV9jb21tdW5pdHksIGZmaV9oX2NvbW11bml0eSkgJT4lCiAgc3VtbWFyaXNlKCkgJT4lCiAgc3RfY2VudHJvaWQoKQogIAoKY29tbXVuaXRpZXNfZGlzdGFuY2VzIDwtIGNvbW11bml0aWVzX3NmICU+JQogIHN0X3RyYW5zZm9ybShjcnMgPSAzMjcxOCkgJT4lCiAgc3RfZGlzdGFuY2UoaXF1aXRvc19jZW50cm8pCgpjb21tdW5pdGllc19kaXN0YW5jZXMgPC0gZW5mcmFtZShjb21tdW5pdGllc19kaXN0YW5jZXMpICU+JQogIG11dGF0ZSgKICAgIGZmaV9pc19jb2RfY29tID0gY29tbXVuaXRpZXNfc2YkZmZpX2hfY29kZV9jb21tdW5pdHksCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gY29tbXVuaXRpZXNfc2YkZmZpX2hfY29tbXVuaXR5LAogICAgZGlzdGFuY2UgPSBhcy5udW1lcmljKHZhbHVlKQogICkgJT4lCiAgc2VsZWN0KC1jKG5hbWUsIHZhbHVlKSkKYGBgCgpMYXMgQ29tdW5pZGFkZXMgbWFzIGNlcmNhbmFzIHkgbWFzIGxlamFuYXMgcG9yIGRpc3RyaXRvOgoKYGBge3J9CmNvbW11bml0aWVzX2Rpc3RhbmNlcyAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9kaXN0cmljdCA9IGNvbW11bml0aWVzX3NmJGZmaV9oX2Rpc3RyaWN0CiAgKSAlPiUKICBncm91cF9ieShmZmlfaF9kaXN0cmljdCkgJT4lCiAgc2xpY2VfbWluKGRpc3RhbmNlLCBuID0gMSkgJT4lCiAgYmluZF9yb3dzKAogICAgY29tbXVuaXRpZXNfZGlzdGFuY2VzICU+JQogICAgICBtdXRhdGUoCiAgICAgICAgZmZpX2hfZGlzdHJpY3QgPSBjb21tdW5pdGllc19zZiRmZmlfaF9kaXN0cmljdAogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaF9kaXN0cmljdCkgJT4lCiAgICAgIHNsaWNlX21heChkaXN0YW5jZSwgbiA9IDEpCiAgKSAlPiUKICBhcnJhbmdlKGZmaV9oX2Rpc3RyaWN0LCBkaXN0YW5jZSkKYGBgCgojIFBsb3RzCgojIyBNYWxhcmlhIEFubnVhbCBQYXJhc2l0ZSBJbmRleAoKCmBgYHtyfQpkYXRhX21hbGFyaWEgPC0gYmluZF9yb3dzKAogIGRhdGFfMjAwMF8yMDE5LAogIGRhdGFfMjAyMF8yMDIxCikgJT4lCiAgZHJvcF9uYShEaXN0cmljdCkKCnBvYl9sb3JldG8gPC0gcG9ibGFjaW9uICU+JQogIGZpbHRlcihkZXAgPT0gIkxPUkVUTyIpICU+JQogIHNlbGVjdChEaXN0cmljdCA9IGRpc3RyLCBUb3RhbCkKYGBgCgoKYGBge3J9Cm1hbGFyaWFfY2FzZXNfcG9iIDwtIGRhdGFfbWFsYXJpYSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKAogICAgY2FzZXNfbWFsYXJpYSA9IHN1bSgKICAgICAgY19hY3Jvc3MoYygKICAgICAgICBgQ29uZmlybWVkIFAuIEZhbGNpcGFydW1gLAogICAgICAgIGBDb25maXJtZWQgUC4gVml2YXhgCiAgICAgICkpLAogICAgICBuYS5ybSA9IFRSVUUKICAgICkKICApICU+JQogIGdyb3VwX2J5KERpc3RyaWN0KSAlPiUKICBzdW1tYXJpc2UoY2FzZXNfbWFsYXJpYSA9IHN1bShjYXNlc19tYWxhcmlhKSkKCm1hbGFyaWFfY2FzZXNfcG9iIDwtIG1hbGFyaWFfY2FzZXNfcG9iICU+JQogIGxlZnRfam9pbigKICAgIHBvYl9sb3JldG8KICApICU+JQogIG11dGF0ZSgKICAgIGFwaSA9IGNhc2VzX21hbGFyaWEgKiAxMDAwIC8gVG90YWwKICApCgpkYXRhKFBlcnUsIHBhY2thZ2UgPSAiaW5ub3ZhciIpCgptYWxhcmlhX2Nhc2VzX3BvYl9zZiA8LSBQZXJ1ICU+JQogIGZpbHRlcihkZXAgPT0gIkxPUkVUTyIpICU+JQogIHNlbGVjdChEaXN0cmljdCA9IGRpc3RyLCBnZW9tZXRyeSkgJT4lIAogIHJpZ2h0X2pvaW4oCiAgICBtYWxhcmlhX2Nhc2VzX3BvYgogICkKYGBgCgoKYGBge3J9CmZpZ3VyZTEgPC0gZ2dwbG90KG1hbGFyaWFfY2FzZXNfcG9iX3NmKSArCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGFwaSwgZ2VvbWV0cnkgPSBnZW9tZXRyeSkpICsKICBnZW9tX3NmKGRhdGEgPSBtYWxhcmlhX2Nhc2VzX3BvYl9zZiAlPiUgZHBseXI6OmZpbHRlcihEaXN0cmljdCA9PSAiQkVMRU4iKSwgY29sb3VyID0gIiNhYTY0MzkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjUsIGFlcyhmaWxsID0gYXBpLCBnZW9tZXRyeSA9IGdlb21ldHJ5KSkgKwogIGdlb21fc2YoZGF0YSA9IG1hbGFyaWFfY2FzZXNfcG9iX3NmICU+JSBkcGx5cjo6ZmlsdGVyKERpc3RyaWN0ID09ICJJTkRJQU5BIiksIGNvbG91ciA9ICIjMjU2ZTVkIiwgZmlsbCA9IE5BLCBzaXplID0gMS41LCBhZXMoZmlsbCA9IGFwaSwgZ2VvbWV0cnkgPSBnZW9tZXRyeSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcigKICAgIG5hbWUgPSAiQVBJIiwKICAgIG5hLnZhbHVlID0gImJsYWNrIiwKICAgICMgbGltaXRzID0gYygwLCA0MDAwKSwKICAgIHBhbGV0dGUgPSAiUmRZbEduIiwKICAgIGRpcmVjdGlvbiA9IC0xLAogICAgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKG4gPSA1KSwKICAgIHZhbHVlcyA9IGMoCiAgICAgIDAsCiAgICAgIDAuMDAxLAogICAgICAwLjAwMiwKICAgICAgMC4wMDUsCiAgICAgIDAuMDA4LAogICAgICAwLjAxLAogICAgICAwLjAyLAogICAgICAwLjAzLAogICAgICAwLjA1LAogICAgICAwLjEsCiAgICAgIDAuNiwKICAgICAgMC45LAogICAgICAxCiAgICApCiAgKSArCiAgbGFicygKICAgIHggPSBOVUxMLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9IE5VTEwKICApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fc2ZfbGFiZWxfcmVwZWwoCiAgICBkYXRhID0gbWFsYXJpYV9jYXNlc19wb2Jfc2YgJT4lIGRwbHlyOjpmaWx0ZXIoRGlzdHJpY3QgPT0gIkJFTEVOIiksCiAgICBhZXMobGFiZWwgPSBEaXN0cmljdCksCiAgICBtaW4uc2VnbWVudC5sZW5ndGggPSAwLAogICAgZm9yY2UgPSAxMDAsCiAgICBudWRnZV94ID0gLTEsCiAgICBzZWVkID0gMTAsCiAgICBjb2xvdXIgPSAiI2FhNjQzOSIKICApICsKICBnZW9tX3NmX2xhYmVsX3JlcGVsKAogICAgZGF0YSA9IG1hbGFyaWFfY2FzZXNfcG9iX3NmICU+JSBkcGx5cjo6ZmlsdGVyKERpc3RyaWN0ID09ICJJTkRJQU5BIiksCiAgICBhZXMobGFiZWwgPSBEaXN0cmljdCksCiAgICBtaW4uc2VnbWVudC5sZW5ndGggPSAwLAogICAgZm9yY2UgPSAxMDAsCiAgICBudWRnZV94ID0gMSwKICAgIHNlZWQgPSAxMCwKICAgIGNvbG91ciA9ICIjMjU2ZTVkIgogICkKCmZpZ3VyZTEKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL2ZpZ3VyZTEucG5nIiwKICBmaWd1cmUxLAogIGRldmljZSA9IGdyRGV2aWNlczo6cG5nLAogIGRwaSA9IDMwMAopCmBgYAoKCiMjIFNlcm9sb2dpY2FsIFJlc3VsdHMKCiMjIyBCeSBjb21tdW5pdGllcyBhbmQgdHlwZSBvZiBwbGFzbW9kaXVtL3RpbWUKYGBge3J9CiMgZmZpX3RvdGFsICU+JQojICAgZ2dwbG90KGFlcygKIyAgICAgeCA9IGZmaV9pc19jb21tdW5pdHksCiMgICAgIGZpbGwgPSBwdl9oaXN0b3JpYwojICAgKSkgKwojICAgY29vcmRfZmxpcCh5bGltID0gYygwLCAwLjI1KSkgKwojICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpCgpwbG90MSA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMpICU+JQogIGxlZnRfam9pbigKICAgIGNvbW11bml0aWVzX2Rpc3RhbmNlcwogICkgICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsCiAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICApICU+JQogIG11dGF0ZSgKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gc3RyX3RvX3RpdGxlKGZmaV9pc19jb21tdW5pdHkpLAogICAgZmZpX2lzX2NvbW11bml0eSA9IHBhc3RlMCgKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgIiAoIiwKICAgICAgc3RyX3RvX3RpdGxlKGZmaV9pc19kaXN0cmljdCksCiAgICAgICIpIgogICAgKSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBmY3RfcmVvcmRlcigKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgZGlzdGFuY2UsCiAgICAgIC5kZXNjID0gVFJVRQogICAgKQogICkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBmZmlfaXNfY29tbXVuaXR5LAogICAgZmlsbCA9IHJlc3VsdF9tYWxhcmlhCiAgKSkgKwogIGZhY2V0X3dyYXAodmFycyhtYWxhcmlhKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvciA9ICJibGFjayIpICsKICBjb29yZF9mbGlwKHlsaW0gPSBjKDAsIDAuMjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpCiAgKSArCiAgI2dnc2NpOjpzY2FsZV9maWxsX2xhbmNldCgpICsKICBpbm5vdmFyOjpzY2FsZV9maWxsX2lubm92YSgibnByIikgKwogIGxhYnMoCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsgIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhY2UgPSAiYm9sZCIsCiAgICAgIHNpemUgPSAxMQogICAgKQogICkKCnBsb3QxCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MV90eXBlb2ZtYWxhcmlhX2NvbW11bml0aWVzLnBuZyIsCiAgcGxvdDEsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEwLAogIGhlaWdodCA9IDkKKQpgYGAKCgojIyMgQnkgY29tbXVuaXRpZXMsIEluZGlhbmEgYW5kIHR5cGUgb2YgcGxhc21vZGl1bS90aW1lCmBgYHtyfQpwbG90MV9pbmRpYW5hIDwtIGZmaV90b3RhbCAlPiUKICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYykgJT4lCiAgbGVmdF9qb2luKAogICAgY29tbXVuaXRpZXNfZGlzdGFuY2VzCiAgKSAgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgbWFsYXJpYSA9PSAicGZfcmVjZW50IiB+ICJSZWNlbnQgUC4gRmFsY2lwYXJ1bSIsCiAgICAgIG1hbGFyaWEgPT0gInBmX2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiAgICAgIG1hbGFyaWEgPT0gInB2X2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIFZpdmF4IgogICAgKSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2lzX2NvbW11bml0eSkKICApICU+JQogIGZpbHRlcihmZmlfaXNfZGlzdHJpY3QgPT0gIklORElBTkEiKSAlPiUKICBtdXRhdGUoCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gZmN0X3Jlb3JkZXIoCiAgICAgIGZmaV9pc19jb21tdW5pdHksCiAgICAgIGRpc3RhbmNlLAogICAgICAuZGVzYyA9IFRSVUUKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gZmZpX2lzX2NvbW11bml0eSwKICAgIGZpbGwgPSByZXN1bHRfbWFsYXJpYQogICkpICsKICBmYWNldF93cmFwKHZhcnMobWFsYXJpYSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3IgPSAiYmxhY2siKSArCiAgY29vcmRfZmxpcCh5bGltID0gYygwLCAwLjI1KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogICNnZ3NjaTo6c2NhbGVfZmlsbF9sYW5jZXQoKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBsYWJzKAogICAgdGl0bGUgPSBzdHJfd3JhcCgiU2Vyb2xvZ2ljYWwgcmVzdWx0cyBieSBwbGFzbW9kaXVtIHR5cGUgb2YgbWFsYXJpYSBpbiB0aGUgSW5kaWFuYSBEaXN0cmljdCIsIDEwMCksCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsgIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhY2UgPSAiYm9sZCIsCiAgICAgIHNpemUgPSAxMQogICAgKQogICkKCnBsb3QxX2luZGlhbmEKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxX3R5cGVvZm1hbGFyaWFfY29tbXVuaXRpZXNfaW5kaWFuYS5wbmciLAogIHBsb3QxX2luZGlhbmEsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEwLAogIGhlaWdodCA9IDkKKQpgYGAKCgojIyMgQnkgY29tbXVuaXRpZXMsIEJlbGVuIGFuZCB0eXBlIG9mIHBsYXNtb2RpdW0vdGltZQpgYGB7cn0KcGxvdDFfYmVsZW4gPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocGZfcmVjZW50OnB2X2hpc3RvcmljKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBjb21tdW5pdGllc19kaXN0YW5jZXMKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsCiAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICApICU+JQogIGZpbHRlcihmZmlfaXNfZGlzdHJpY3QgPT0gIkJFTEVOIikgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgbWFsYXJpYSA9PSAicGZfcmVjZW50IiB+ICJSZWNlbnQgUC4gRmFsY2lwYXJ1bSIsCiAgICAgIG1hbGFyaWEgPT0gInBmX2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiAgICAgIG1hbGFyaWEgPT0gInB2X2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIFZpdmF4IgogICAgKSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2lzX2NvbW11bml0eSksCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gZmN0X3Jlb3JkZXIoCiAgICAgIGZmaV9pc19jb21tdW5pdHksCiAgICAgIGRpc3RhbmNlLAogICAgICAuZGVzYyA9IFRSVUUKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gZmZpX2lzX2NvbW11bml0eSwKICAgIGZpbGwgPSByZXN1bHRfbWFsYXJpYQogICkpICsKICBmYWNldF93cmFwKHZhcnMobWFsYXJpYSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3IgPSAiYmxhY2siKSArCiAgY29vcmRfZmxpcCh5bGltID0gYygwLCAwLjI1KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogICNnZ3NjaTo6c2NhbGVfZmlsbF9sYW5jZXQoKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBsYWJzKAogICAgdGl0bGUgPSBzdHJfd3JhcCgiU2Vyb2xvZ2ljYWwgcmVzdWx0cyBieSBwbGFzbW9kaXVtIHR5cGUgb2YgbWFsYXJpYSBpbiB0aGUgQmVsZW4gRGlzdHJpY3QiLCAxMDApLAogICAgeCA9ICJDb21tdW5pdGllcyIsCiAgICB5ID0gIlBlcmNlbnRhZ2UiCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiUmVzdWx0cyIpCiAgKSArICAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICkKICApCgpwbG90MV9iZWxlbgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDFfdHlwZW9mbWFsYXJpYV9jb21tdW5pdGllc19iZWxlbi5wbmciLAogIHBsb3QxX2JlbGVuLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMCwKICBoZWlnaHQgPSA5CikKYGBgCgojIyMgQnkgY29tbXVuaXRpZXMsIHR5cGUgb2YgcGxhc21vZGl1bSBleHBvc3VyZQpgYGB7cn0KcGxvdDIgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocGZfZXhwb3N1cmUsIHB2X2V4cG9zdXJlKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBjb21tdW5pdGllc19kaXN0YW5jZXMKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwdl9leHBvc3VyZTpwZl9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAgJT4lCiAgbXV0YXRlKAogICAgZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgICAgIGV4cG9zdXJlID09ICJwdl9leHBvc3VyZSIgfiAiUC4gVml2YXggRXhwb3N1cmUiLAogICAgICAgICBleHBvc3VyZSA9PSAicGZfZXhwb3N1cmUiIH4gIlAuIEZhbGNpcGFydW0gRXhwb3N1cmUiCiAgICApLAogICAgZmZpX2lzX2NvbW11bml0eSA9IHN0cl90b190aXRsZShmZmlfaXNfY29tbXVuaXR5KSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBmY3RfcmVvcmRlcigKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgZGlzdGFuY2UsCiAgICAgIC5kZXNjID0gVFJVRQogICAgKQogICkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBmZmlfaXNfY29tbXVuaXR5LAogICAgZmlsbCA9IHJlc3VsdF9leHBvc3VyZQogICkpICsKICBmYWNldF93cmFwKHZhcnMoZXhwb3N1cmUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIikgKwogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoMCwgMC40MCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkKICApICsKICAjIGdnc2NpOjpzY2FsZV9maWxsX2xhbmNldCgpICsKICBpbm5vdmFyOjpzY2FsZV9maWxsX2lubm92YSgibnByIikgKwogIGxhYnMoCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICkKICApCgpwbG90MgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDJfdHlwZW9mbWFsYXJpYV9jb21tdW5pdGllcy5wbmciLAogIHBsb3QyLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMCwKICBoZWlnaHQgPSA5CikKYGBgCgojIyMgQnkgY29tbXVuaXRpZXMsIHRpbWUgb2YgcGxhc21vZGl1bSBleHBvc3VyZQpgYGB7cn0KcGxvdDMgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocmVjZW50X2V4cG9zdXJlLCBoaXN0b3JpY2FsX2V4cG9zdXJlKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBjb21tdW5pdGllc19kaXN0YW5jZXMKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSByZWNlbnRfZXhwb3N1cmU6aGlzdG9yaWNhbF9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgZXhwb3N1cmUgPT0gInJlY2VudF9leHBvc3VyZSIgfiAiUmVjZW50IEV4cG9zdXJlIiwKICAgICAgZXhwb3N1cmUgPT0gImhpc3RvcmljYWxfZXhwb3N1cmUiIH4gIkhpc3RvcmljYWwgRXhwb3N1cmUiCiAgICApLAogICAgZmZpX2lzX2NvbW11bml0eSA9IHN0cl90b190aXRsZShmZmlfaXNfY29tbXVuaXR5KSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBmY3RfcmVvcmRlcigKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgZGlzdGFuY2UsCiAgICAgIC5kZXNjID0gVFJVRQogICAgKQogICkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBmZmlfaXNfY29tbXVuaXR5LAogICAgZmlsbCA9IHJlc3VsdF9leHBvc3VyZQogICkpICsKICBmYWNldF93cmFwKHZhcnMoZXhwb3N1cmUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIikgKwogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoMCwgMC4zMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkKICApICsKICAjIGdnc2NpOjpzY2FsZV9maWxsX2xhbmNldCgpICsKICBpbm5vdmFyOjpzY2FsZV9maWxsX2lubm92YSgibnByIikgKwogIGxhYnMoCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICkKICApCgpwbG90MwpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDNfdHlwZW9mbWFsYXJpYV9jb21tdW5pdGllcy5wbmciLAogIHBsb3QzLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMCwKICBoZWlnaHQgPSA5CikKYGBgCgoKYGBge3J9CiMgZmZpX3RvdGFsICU+JQojICAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsIGFnZV9jYXQpICU+JQojICAgcGl2b3RfbG9uZ2VyKAojICAgICBjb2xzID0gcGZfcmVjZW50OnB2X2hpc3RvcmljLAojICAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKIyAgICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgojICAgKSAlPiUKIyAgIG11dGF0ZSgKIyAgICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiMgICAgICAgcmVzdWx0X21hbGFyaWEgPT0gIlBvc2l0aXZlIiB+IDEsCiMgICAgICAgVFJVRSB+IDAKIyAgICAgKSwKIyAgICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKIyAgICAgICBtYWxhcmlhID09ICJwZl9yZWNlbnQiIH4gIlJlY2VudCBQLiBGYWxjaXBhcnVtIiwKIyAgICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKIyAgICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiMgICAgICAgbWFsYXJpYSA9PSAicHZfaGlzdG9yaWMiIH4gIkhpc3RvcmljYWwgUC4gVml2YXgiCiMgICAgICksCiMgICAgIGZmaV9pc19jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2lzX2NvbW11bml0eSkKIyAgICkgJT4lCiMgICBncm91cF9ieShmZmlfaXNfY29tbXVuaXR5LCBhZ2VfY2F0LCBtYWxhcmlhKSAlPiUKIyAgIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKSAlPiUKIyAgIGdncGxvdCgKIyAgICAgYWVzKAojICAgICAgIHggPSBhZ2VfY2F0LAojICAgICAgIHkgPSByZXN1bHRfbWFsYXJpYSwKIyAgICAgICBjb2xvciA9IG1hbGFyaWEsCiMgICAgICAgZ3JvdXAgPSBtYWxhcmlhCiMgICAgICkKIyAgICkgKwojICAgZ2VvbV9wb2ludCgpICsKIyAgIGdlb21fbGluZSgpICsKIyAgIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfY29tbXVuaXR5KSkgKwojICAgdGhlbWVfYncoKQpgYGAKCiMjIFNlcm9wb3NpdGl2aXR5IDQgbWFsYXJpYQoKIyMjIEJ5IGRpc3RyaWN0CmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0IDwtIGZmaV90b3RhbCAlPiUKICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYywgYWdlX2NhdCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19kaXN0cmljdCwgYWdlX2NhdCwgbWFsYXJpYSkgJT4lCiAgc3VtbWFyaXNlKHJlc3VsdF9tYWxhcmlhID0gbWVhbihyZXN1bHRfbWFsYXJpYSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfbWFsYXJpYSwKICAgICAgY29sb3IgPSBtYWxhcmlhLAogICAgICBncm91cCA9IG1hbGFyaWEKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGxpbWl0cyA9IGMoMCwgMC40MCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQoKc2Vyb180bWFsYXJpYV9kaXN0cmljdApgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDRfc2Vyb180bWFsYXJpYV9kaXN0cmljdC5wbmciLAogIHNlcm9fNG1hbGFyaWFfZGlzdHJpY3QsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDcuNQopCmBgYAoKCiMjIyBCeSBIZWFsdGggRmFjaWxpdHkKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2hmIDwtIGZmaV90b3RhbCAlPiUKICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYywgYWdlX2NhdCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICksCiAgICBmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUgPSBwYXN0ZSgKICAgICAgZmZpX2lzX2Rpc3RyaWN0LAogICAgICBmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUsCiAgICAgIHNlcCA9ICIgLSAiCiAgICApCiAgKSAlPiUKICBncm91cF9ieShmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUsIGFnZV9jYXQsIG1hbGFyaWEpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsCiAgICAgIHZqdXN0ID0gMSwKICAgICAgaGp1c3QgPSAxCiAgICApCiAgKQogIApzZXJvXzRtYWxhcmlhX2hmCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90NV9zZXJvXzRtYWxhcmlhX2hmLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9oZiwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTAsCiAgaGVpZ2h0ID0gNwopCmBgYAoKIyMgU2VvcG9zaXRpdml0eSBieSBUeXBlIG9mIE1hbGFyaWEKCiMjIyBCeSBEaXN0cmljdAoKYGBge3J9CmZmaV90eXBlb2ZfbWFsYXJpYSA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9leHBvc3VyZSwgcHZfZXhwb3N1cmUsIGFnZV9jYXQpICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwdl9leHBvc3VyZTpwZl9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgZXhwb3N1cmUgPT0gInB2X2V4cG9zdXJlIiB+ICJQLiBWaXZheCBFeHBvc3VyZSIsCiAgICAgIGV4cG9zdXJlID09ICJwZl9leHBvc3VyZSIgfiAiUC4gRmFsY2lwYXJ1bSBFeHBvc3VyZSIKICAgICksCiAgICByZXN1bHRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9leHBvc3VyZSA9PSAiUG9zaXRpdmUiIH4gMSwKICAgICAgVFJVRSB+IDAKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3QgPC0gZmZpX3R5cGVvZl9tYWxhcmlhICU+JQogIGdyb3VwX2J5KGZmaV9pc19kaXN0cmljdCwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGxpbWl0cyA9IGMoMCwgMC40MCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDZfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0LnBuZyIsCiAgc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0LAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMiwKICBoZWlnaHQgPSA3LjUKKQpgYGAKCiMjIyBCeSBIZWFsdGggRmFjaWxpdHkKCmBgYHtyfQpzZXJvX3R5cGVvZm1hbGFyaWFfaGYgPC0gZmZpX3R5cGVvZl9tYWxhcmlhICU+JQogIGdyb3VwX2J5KGZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2hlYWx0aF9mYWNpbGl0eV9uYW1lKSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfaGYKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3Q3X3Nlcm9fdHlwZW9mbWFsYXJpYV9oZi5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9oZiwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTMsCiAgaGVpZ2h0ID0gOQopCmBgYAoKIyMgU2Vyb3Bvc2l0aXZpdHkgYnkgVGltZSBvZiBFeHBvc3VyZSAKCiMjIyBCeSBEaXN0cmljdApgYGB7cn0KZmZpX3RpbWVvZm1hbGFyaWEgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocmVjZW50X2V4cG9zdXJlLCBoaXN0b3JpY2FsX2V4cG9zdXJlLCBhZ2VfY2F0KSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gcmVjZW50X2V4cG9zdXJlOmhpc3RvcmljYWxfZXhwb3N1cmUsCiAgICBuYW1lc190byA9ICJleHBvc3VyZSIsCiAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X2V4cG9zdXJlIgogICkgJT4lCiAgbXV0YXRlKAogICAgZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIGV4cG9zdXJlID09ICJyZWNlbnRfZXhwb3N1cmUiIH4gIlJlY2VudCBFeHBvc3VyZSIsCiAgICAgIGV4cG9zdXJlID09ICJoaXN0b3JpY2FsX2V4cG9zdXJlIiB+ICJIaXN0b3JpY2FsIEV4cG9zdXJlIgogICAgKSwKICAgIHJlc3VsdF9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIGFjcm9zcygKICAgICAgYyhmZmlfaXNfY29tbXVuaXR5OmZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSksCiAgICAgIHN0cl90b190aXRsZQogICAgKQogICkKCnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdCA8LSBmZmlfdGltZW9mbWFsYXJpYSAlPiUKICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIGFnZV9jYXQsIGV4cG9zdXJlKSAlPiUKICBzdW1tYXJpc2UocmVzdWx0X2V4cG9zdXJlID0gbWVhbihyZXN1bHRfZXhwb3N1cmUpKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZmaV9pc19kaXN0cmljdCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICBsaW1pdHMgPSBjKDAsIDAuNDApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3Q4X3Nlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdC5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gNy41CikKYGBgCgojIyMgQnkgSGVhbHRoIEZhY2lsaXR5CgpgYGB7cn0Kc2Vyb190aW1lb2ZtYWxhcmlhX2hmIDwtIGZmaV90aW1lb2ZtYWxhcmlhICU+JQogIGdyb3VwX2J5KGZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2hlYWx0aF9mYWNpbGl0eV9uYW1lKSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsgCiAgdGhlbWVfYncoKQogIApzZXJvX3RpbWVvZm1hbGFyaWFfaGYKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3Q5X3Nlcm9fdGltZW9mbWFsYXJpYV9oZi5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9oZiwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTMsCiAgaGVpZ2h0ID0gOQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCBzZXgKCmBgYHtyfQpsaWJyYXJ5KHJsYW5nKQoKc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSA8LSBmdW5jdGlvbihkYXRhLCB0eXBlLCB2YXJpYWJsZSwgLi4uKSB7CiAgaWYgKHR5cGUgPT0gIjRtYWxhcmlhIikgewogICAgZmZpX3RvdGFsICU+JQogICAgICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYywge3sgdmFyaWFibGUgfX0sIC4uLikgJT4lCiAgICAgIHBpdm90X2xvbmdlcigKICAgICAgICBjb2xzID0gcGZfcmVjZW50OnB2X2hpc3RvcmljLAogICAgICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICAgICAgKSAlPiUKICAgICAgbXV0YXRlKAogICAgICAgIHJlc3VsdF9tYWxhcmlhID0gY2FzZV93aGVuKAogICAgICAgICAgcmVzdWx0X21hbGFyaWEgPT0gIlBvc2l0aXZlIiB+IDEsCiAgICAgICAgICBUUlVFIH4gMAogICAgICAgICksCiAgICAgICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICAgICAgbWFsYXJpYSA9PSAicGZfaGlzdG9yaWMiIH4gIkhpc3RvcmljYWwgUC4gRmFsY2lwYXJ1bSIsCiAgICAgICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiAgICAgICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICAgICApLAogICAgICAgIGFjcm9zcygKICAgICAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICAgICAgc3RyX3RvX3RpdGxlCiAgICAgICAgKQogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIHt7IHZhcmlhYmxlIH19LCAuLi4sIG1hbGFyaWEpICU+JQogICAgICBzdW1tYXJpc2UocmVzdWx0X21hbGFyaWEgPSBtZWFuKHJlc3VsdF9tYWxhcmlhKSkKICB9IGVsc2UgaWYgKHR5cGUgPT0gInR5cGVvZm1hbGFyaWEiICkgewogICAgZmZpX3RvdGFsICU+JQogICAgICBkcm9wX25hKHBmX2V4cG9zdXJlLCBwdl9leHBvc3VyZSwge3sgdmFyaWFibGUgfX0sIC4uLikgJT4lCiAgICAgIHBpdm90X2xvbmdlcigKICAgICAgICBjb2xzID0gcHZfZXhwb3N1cmU6cGZfZXhwb3N1cmUsCiAgICAgICAgbmFtZXNfdG8gPSAiZXhwb3N1cmUiLAogICAgICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgICAgICkgJT4lCiAgICAgIG11dGF0ZSgKICAgICAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgICAgIGV4cG9zdXJlID09ICJwdl9leHBvc3VyZSIgfiAiUC4gVml2YXggRXhwb3N1cmUiLAogICAgICAgICAgZXhwb3N1cmUgPT0gInBmX2V4cG9zdXJlIiB+ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgogICAgICAgICksCiAgICAgICAgcmVzdWx0X2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICAgICAgVFJVRSB+IDAKICAgICAgICApLAogICAgICAgIGFjcm9zcygKICAgICAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICAgICAgc3RyX3RvX3RpdGxlCiAgICAgICAgKQogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIHt7IHZhcmlhYmxlIH19LCAuLi4sIGV4cG9zdXJlKSAlPiUKICAgICAgc3VtbWFyaXNlKHJlc3VsdF9leHBvc3VyZSA9IG1lYW4ocmVzdWx0X2V4cG9zdXJlKSkKICB9IGVsc2UgaWYgKHR5cGUgPT0gInRpbWVvZm1hbGFyaWEiKSB7CiAgICBmZmlfdG90YWwgJT4lCiAgICAgIGRyb3BfbmEocmVjZW50X2V4cG9zdXJlLCBoaXN0b3JpY2FsX2V4cG9zdXJlLCAKICAgICAgICAgICAgICB7eyB2YXJpYWJsZSB9fSwgLi4uKSAlPiUKICAgICAgcGl2b3RfbG9uZ2VyKAogICAgICAgIGNvbHMgPSByZWNlbnRfZXhwb3N1cmU6aGlzdG9yaWNhbF9leHBvc3VyZSwKICAgICAgICBuYW1lc190byA9ICJleHBvc3VyZSIsCiAgICAgICAgdmFsdWVzX3RvID0gInJlc3VsdF9leHBvc3VyZSIKICAgICAgKSAlPiUKICAgICAgbXV0YXRlKAogICAgICAgIGV4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICAgICAgZXhwb3N1cmUgPT0gInJlY2VudF9leHBvc3VyZSIgfiAiUmVjZW50IEV4cG9zdXJlIiwKICAgICAgICAgIGV4cG9zdXJlID09ICJoaXN0b3JpY2FsX2V4cG9zdXJlIiB+ICJIaXN0b3JpY2FsIEV4cG9zdXJlIgogICAgICAgICksCiAgICAgICAgcmVzdWx0X2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICAgICAgVFJVRSB+IDAKICAgICAgICApLAogICAgICAgIGFjcm9zcygKICAgICAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICAgICAgc3RyX3RvX3RpdGxlCiAgICAgICAgKQogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIHt7IHZhcmlhYmxlIH19LCAuLi4sIGV4cG9zdXJlKSAlPiUKICAgICAgc3VtbWFyaXNlKHJlc3VsdF9leHBvc3VyZSA9IG1lYW4ocmVzdWx0X2V4cG9zdXJlKSkgICAgICAKICB9ICAKfQpgYGAKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlciA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAiNG1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlcgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDEwX3Nlcm9fNG1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInR5cGVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTFfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTJfc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCBFZHVjYXRpb24gTGV2ZWwKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2VkdWxldmVsIDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICI0bWFsYXJpYSIsCiAgYWdlX2NhdCwKICBlZHVjYXRpb25fbGV2ZWwKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZWR1Y2F0aW9uX2xldmVsKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjQwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2VkdWxldmVsCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTNfc2Vyb180bWFsYXJpYV9kaXN0cmljdF9lZHVsZXZlbC5wbmciLAogIHNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9lZHVsZXZlbCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBlZHVjYXRpb25fbGV2ZWwKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZWR1Y2F0aW9uX2xldmVsKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxNF9zZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwucG5nIiwKICBzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9lZHVsZXZlbCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidGltZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBlZHVjYXRpb25fbGV2ZWwKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZWR1Y2F0aW9uX2xldmVsKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxNV9zZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwucG5nIiwKICBzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCBGZXZlciBNb250aAoKIyMjIyBCeSA0IG1hbGFyaWEKYGBge3J9CmZmaV9mZXZlcl9tb250aCA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsIGFnZV9jYXQsIGZmaV9pc19mZXZlcl9tb250aCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19mZXZlcl9tb250aCwgYWdlX2NhdCwgbWFsYXJpYSkgJT4lCiAgc3VtbWFyaXNlKHJlc3VsdF9tYWxhcmlhID0gbWVhbihyZXN1bHRfbWFsYXJpYSkpCgoKc2Vyb180bWFsYXJpYV9mZXZlcl9tb250aCA8LSBmZmlfZmV2ZXJfbW9udGggJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIHkgPSBhZ2VfY2F0LAogICAgICBncm91cCA9IGFnZV9jYXQKICAgICkKICApICsKICBnZW9tX3BhdGgoCiAgICBjb2xvciA9ICIjYmRiZGJkIgogICkgKwogIGdlb21fcG9pbnQoCiAgICBhZXMoY29sb3IgPSBtYWxhcmlhKSwKICAgIHNpemUgPSAzCiAgKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZmaV9pc19mZXZlcl9tb250aCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjUpCiAgKSArCiAgbGFicygKICAgIHkgPSAiQWdlIiwKICAgIHggPSAiU2Vyb3Bvc2l0aXZpdHkiLAogICAgdGl0bGUgPSBzdHJfd3JhcCgiTWFsYXJpYSBzZXJvcG9zaXRpdml0eSBieSB0eXBlIG9mIGV4cG9zdXJlLCBwbGFzbW9kaXVtIGFuZCBwcmVzZW5jZSBvZiBmZXZlciBpbiB0aGUgbGFzdCBtb250aCIsIDEwMCkKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDE2X3Nlcm9fNG1hbGFyaWFfZmV2ZXJtb250aC5wbmciLAogIHNlcm9fNG1hbGFyaWFfZmV2ZXJfbW9udGgsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMjIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0KZmZpX2ZldmVyX21vbnRoX3R5cGVvZm1hbGFyaWEgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocGZfcmVjZW50OnB2X2hpc3RvcmljLCBhZ2VfY2F0LCBmZmlfaXNfZmV2ZXJfbW9udGgpICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwdl9leHBvc3VyZTpwZl9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAlPiUKICAgIG11dGF0ZSgKICAgICAgZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgICAgZXhwb3N1cmUgPT0gInB2X2V4cG9zdXJlIiB+ICJQLiBWaXZheCBFeHBvc3VyZSIsCiAgICAgICAgZXhwb3N1cmUgPT0gInBmX2V4cG9zdXJlIiB+ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgogICAgICApLAogICAgICByZXN1bHRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICAgIFRSVUUgfiAwCiAgICAgICksCiAgICAgIGFjcm9zcygKICAgICAgICBjKGZmaV9pc19jb21tdW5pdHk6ZmZpX2lzX2hlYWx0aF9mYWNpbGl0eV9uYW1lKSwKICAgICAgICBzdHJfdG9fdGl0bGUKICAgICAgKQogICAgKSAlPiUKICAgIGdyb3VwX2J5KGZmaV9pc19mZXZlcl9tb250aCwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogICAgc3VtbWFyaXNlKHJlc3VsdF9leHBvc3VyZSA9IG1lYW4ocmVzdWx0X2V4cG9zdXJlKSkKCnNlcm9fdHlwZW9mbWFsYXJpYV9mZXZlcl9tb250aCA8LSBmZmlfZmV2ZXJfbW9udGhfdHlwZW9mbWFsYXJpYSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIHkgPSBhZ2VfY2F0LAogICAgICBncm91cCA9IGFnZV9jYXQKICAgICkKICApICsKICBnZW9tX3BhdGgoCiAgICBjb2xvciA9ICIjYmRiZGJkIgogICkgKwogIGdlb21fcG9pbnQoCiAgICBhZXMoY29sb3IgPSBleHBvc3VyZSksCiAgICBzaXplID0gMwogICkgKwogIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfZmV2ZXJfbW9udGgpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgIyBsaW1pdHMgPSBjKDAsIDAuNSkKICApICsKICBsYWJzKAogICAgeSA9ICJBZ2UiLAogICAgeCA9ICJTZXJvcG9zaXRpdml0eSIsCiAgICB0aXRsZSA9IHN0cl93cmFwKCJNYWxhcmlhIHNlcm9wb3NpdGl2aXR5IGJ5IHR5cGUgb2YgcGxhc21vZGl1bSBhbmQgcHJlc2VuY2Ugb2YgZmV2ZXIgaW4gdGhlIGxhc3QgbW9udGgiLCAxMDApCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxNl9zZXJvX3R5cGVvZm1hbGFyaWFfZmV2ZXJtb250aC5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9mZXZlcl9tb250aCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKCmBgYHtyfQpmZmlfZmV2ZXJfbW9udGhfdGltZW9mbWFsYXJpYSA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsIGFnZV9jYXQsIGZmaV9pc19mZXZlcl9tb250aCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHJlY2VudF9leHBvc3VyZTpoaXN0b3JpY2FsX2V4cG9zdXJlLAogICAgbmFtZXNfdG8gPSAiZXhwb3N1cmUiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9leHBvc3VyZSIKICApICU+JQogIG11dGF0ZSgKICAgIGV4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBleHBvc3VyZSA9PSAicmVjZW50X2V4cG9zdXJlIiB+ICJSZWNlbnQgRXhwb3N1cmUiLAogICAgICBleHBvc3VyZSA9PSAiaGlzdG9yaWNhbF9leHBvc3VyZSIgfiAiSGlzdG9yaWNhbCBFeHBvc3VyZSIKICAgICksCiAgICByZXN1bHRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9leHBvc3VyZSA9PSAiUG9zaXRpdmUiIH4gMSwKICAgICAgVFJVRSB+IDAKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19mZXZlcl9tb250aCwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZmV2ZXJfbW9udGggPC0gZmZpX2ZldmVyX21vbnRoX3R5cGVvZm1hbGFyaWEgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICB5ID0gYWdlX2NhdCwKICAgICAgZ3JvdXAgPSBhZ2VfY2F0CiAgICApCiAgKSArCiAgZ2VvbV9wYXRoKAogICAgY29sb3IgPSAiI2JkYmRiZCIKICApICsKICBnZW9tX3BvaW50KAogICAgYWVzKGNvbG9yID0gZXhwb3N1cmUpLAogICAgc2l6ZSA9IDMKICApICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2ZldmVyX21vbnRoKSkgKwogIHNjYWxlX3hfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICMgbGltaXRzID0gYygwLCAwLjUpCiAgKSArCiAgbGFicygKICAgIHkgPSAiQWdlIiwKICAgIHggPSAiU2Vyb3Bvc2l0aXZpdHkiLAogICAgdGl0bGUgPSBzdHJfd3JhcCgiTWFsYXJpYSBzZXJvcG9zaXRpdml0eSBieSB0aW1lIG9mIHBsYXNtb2RpdW0gYW5kIHByZXNlbmNlIG9mIGZldmVyIGluIHRoZSBsYXN0IG1vbnRoIiwgMTAwKQogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTZfc2Vyb190aW1lb2ZtYWxhcmlhX2ZldmVybW9udGgucG5nIiwKICBzZXJvX3RpbWVvZm1hbGFyaWFfZmV2ZXJfbW9udGgsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMjIFJlbGF0aW9uIHdpdGggQW50aW1hbGFyaWFsIERydWdzCgojIyMgQnkgNCBNYWxhcmlhCgpgYGB7cn0Kc2Vyb180bWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgIjRtYWxhcmlhIiwKICBhZ2VfY2F0LAogIGZmaV9pc19hbnRpbWFsX2RydWdfdXNlCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19hbnRpbWFsX2RydWdfdXNlKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICBsaW1pdHMgPSBjKDAsIDAuNTApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfYW50aW1hbGRydWdzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTlfc2Vyb180bWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncywKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncyA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfYW50aW1hbF9kcnVnX3VzZQopICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF9ncmlkKAogICAgdmFycyhmZmlfaXNfYW50aW1hbF9kcnVnX3VzZSksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjYwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfYW50aW1hbGRydWdzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MjBfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncy5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZmZpX2lzX2FudGltYWxfZHJ1Z191c2UKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZmZpX2lzX2FudGltYWxfZHJ1Z191c2UpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGxpbWl0cyA9IGMoMCwgMC41KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfYW50aW1hbGRydWdzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MjFfc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncy5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMjIFJlbGF0aW9uIHdpdGggdGltZSBvZiBzb21lb25lIGhhZCBtYWxhcmlhCgojIyMgQnkgZ2VuZXJhbCBtYWxhcmlhCgpgYGB7cn0KZmZpXzRtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfdG90YWwgJT4lIAogIGRyb3BfbmEob25seV9wdl9leHBvc3VyZTpmcmVlZG9tX21hbGFyaWEsIAogICAgICAgICAgYWdlX2NvZGUsIGZmaV9pc19tYWxfbGlmZXRpbWUpICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gb25seV9wdl9leHBvc3VyZTpmcmVlZG9tX21hbGFyaWEsCiAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICApICU+JSAKICBtdXRhdGUoCiAgICByZXN1bHRfbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgcmVzdWx0X21hbGFyaWEgPT0gIlBvc2l0aXZlIiB+IDEsCiAgICAgIFRSVUUgfiAwCiAgICApLAogICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgbWFsYXJpYSA9PSAib25seV9wdl9leHBvc3VyZSIgfiAiT25seSBQLiB2aXZheCIsCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcGZfZXhwb3N1cmUiIH4gIk9ubHkgUC4gZmFsY2lwYXJ1bSIsCiAgICAgIG1hbGFyaWEgPT0gInB2X3BmX2V4cG9zdXJlIiB+ICJQLiB2aXZheCAmIGZhbGNpcGFydW0gRXhwb3N1cmUiLAogICAgICBtYWxhcmlhID09ICJmcmVlZG9tX21hbGFyaWEiIH4gIkZyZWVkb20gZnJvbSBNYWxhcmlhIgogICAgKSwKICAgIGFjcm9zcygKICAgICAgYyhmZmlfaXNfY29tbXVuaXR5OmZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSksCiAgICAgIHN0cl90b190aXRsZQogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZmZpX2lzX21hbF9saWZldGltZSwgYWdlX2NvZGUsIG1hbGFyaWEpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKQoKc2Vyb180bWFsYXJpYV9tYWxfbGlmZXRpbWUgPC0gZmZpXzRtYWxhcmlhX21hbF9saWZldGltZSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY29kZSwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBmaWxsID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fYXJlYSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsaW1pdHMgPSBjKDEsIDgpLAogICAgYnJlYWtzID0gc2VxKDEsIDgsIDEpLAogICAgbGFiZWxzID0gYygKICAgICAgIlswLTEwKSIsCiAgICAgICJbMTAtMjApIiwKICAgICAgIlsyMC0zMCkiLAogICAgICAiWzMwLTQwKSIsCiAgICAgICJbNDAtNTApIiwKICAgICAgIls1MC02MCkiLAogICAgICAiWzYwLTcwKSIsCiAgICAgICJbNzArKSIKICAgICksCiAgICBleHBhbmQgPSBjKDAsIDApCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgZXhwYW5kID0gYygwLCAwKQogICkgKwogIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfbWFsX2xpZmV0aW1lKSkgKwogIGxhYnMoCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IiwKICAgIHggPSAiQWdlIiwKICAgIHRpdGxlID0gc3RyX3dyYXAoIk1hbGFyaWEgc2Vyb3Bvc2l0aXZpdHkgYnkgdHlwZSBvZiBleHBvc3VyZSwgcGxhc21vZGl1bSBhbmQgaG93IG1hbnkgdGltZXMgdGhleSB0aGluayB0aGV5IGhhdmUgaGFkIG1hbGFyaWEiLCAxMDApCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LAogICAgICB2anVzdCA9IDEsCiAgICAgIGhqdXN0ID0gMQogICAgKSwKICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEsICJsaW5lcyIpCiAgKQoKc2Vyb180bWFsYXJpYV9tYWxfbGlmZXRpbWUKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QyMl9zZXJvXzRvZm1hbGFyaWFfbWFsX2xpZmV0aW1lLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9tYWxfbGlmZXRpbWUsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDExLAogIGhlaWdodCA9IDUKKQpgYGAKCiMjIyBCeSBSZWNlbnQgTWFsYXJpYQoKYGBge3J9CmZmaV9yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfdG90YWwgJT4lIAogIGRyb3BfbmEob25seV9wdl9yZWNlbnQ6ZnJlZWRvbV9tYWxhcmlhX3JlY2VudCwgCiAgICAgICAgICBhZ2VfY29kZSwgZmZpX2lzX21hbF9saWZldGltZSkgJT4lIAogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBvbmx5X3B2X3JlY2VudDpmcmVlZG9tX21hbGFyaWFfcmVjZW50LAogICAgbmFtZXNfdG8gPSAibWFsYXJpYSIsCiAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X21hbGFyaWEiCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcHZfcmVjZW50IiB+ICJPbmx5IFAuIHZpdmF4IFJlY2VudCIsCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcGZfcmVjZW50IiB+ICJPbmx5IFAuIGZhbGNpcGFydW0gUmVjZW50IiwKICAgICAgbWFsYXJpYSA9PSAicHZfcGZfcmVjZW50IiB+ICJQLiB2aXZheCAmIGZhbGNpcGFydW0gUmVjZW50IiwKICAgICAgbWFsYXJpYSA9PSAiZnJlZWRvbV9tYWxhcmlhX3JlY2VudCIgfiAiRnJlZWRvbSBmcm9tIE1hbGFyaWEgUmVjZW50IgogICAgKSwKICAgIGFjcm9zcygKICAgICAgYyhmZmlfaXNfY29tbXVuaXR5OmZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSksCiAgICAgIHN0cl90b190aXRsZQogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZmZpX2lzX21hbF9saWZldGltZSwgYWdlX2NvZGUsIG1hbGFyaWEpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKQoKc2Vyb19yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfcmVjZW50bWFsYXJpYV9tYWxfbGlmZXRpbWUgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NvZGUsCiAgICAgIHkgPSByZXN1bHRfbWFsYXJpYSwKICAgICAgZmlsbCA9IG1hbGFyaWEKICAgICkKICApICsKICBnZW9tX2FyZWEoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGltaXRzID0gYygxLCA4KSwKICAgIGJyZWFrcyA9IHNlcSgxLCA4LCAxKSwKICAgIGxhYmVscyA9IGMoCiAgICAgICJbMC0xMCkiLAogICAgICAiWzEwLTIwKSIsCiAgICAgICJbMjAtMzApIiwKICAgICAgIlszMC00MCkiLAogICAgICAiWzQwLTUwKSIsCiAgICAgICJbNTAtNjApIiwKICAgICAgIls2MC03MCkiLAogICAgICAiWzcwKykiCiAgICApLAogICAgZXhwYW5kID0gYygwLCAwKQogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGV4cGFuZCA9IGMoMCwgMCkKICApICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX21hbF9saWZldGltZSkpICsKICBsYWJzKAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIsCiAgICB4ID0gIkFnZSIsCiAgICB0aXRsZSA9IHN0cl93cmFwKCJNYWxhcmlhIHNlcm9wb3NpdGl2aXR5IGJ5IHJlY2VudCBleHBvc3VyZSBhbmQgaG93IG1hbnkgdGltZXMgdGhleSB0aGluayB0aGV5IGhhdmUgaGFkIG1hbGFyaWEiLCAxMDApCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LAogICAgICB2anVzdCA9IDEsCiAgICAgIGhqdXN0ID0gMQogICAgKSwKICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEsICJsaW5lcyIpCiAgKQoKc2Vyb19yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDIzX3Nlcm9fcmVjZW50X21hbGFyaWFfbWFsX2xpZmV0aW1lLnBuZyIsCiAgc2Vyb19yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZSwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTEsCiAgaGVpZ2h0ID0gNQopCmBgYAoKCiMjIyBCeSBIaXN0b3JpYyBNYWxhcmlhCgpgYGB7cn0KZmZpX2hpc3RvcmljbWFsYXJpYV9tYWxfbGlmZXRpbWUgPC0gZmZpX3RvdGFsICU+JSAKICBkcm9wX25hKG9ubHlfcHZfaGlzdG9yaWM6ZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljLCAKICAgICAgICAgIGFnZV9jb2RlLCBmZmlfaXNfbWFsX2xpZmV0aW1lKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IG9ubHlfcHZfaGlzdG9yaWM6ZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljLAogICAgbmFtZXNfdG8gPSAibWFsYXJpYSIsCiAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X21hbGFyaWEiCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcHZfaGlzdG9yaWMiIH4gIk9ubHkgUC4gdml2YXggSGlzdG9yaWMiLAogICAgICBtYWxhcmlhID09ICJvbmx5X3BmX2hpc3RvcmljIiB+ICJPbmx5IFAuIGZhbGNpcGFydW0gSGlzdG9yaWMiLAogICAgICBtYWxhcmlhID09ICJwdl9wZl9oaXN0b3JpYyIgfiAiUC4gdml2YXggJiBmYWxjaXBhcnVtIEhpc3RvcmljIiwKICAgICAgbWFsYXJpYSA9PSAiZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljIiB+ICJGcmVlZG9tIGZyb20gTWFsYXJpYSBIaXN0b3JpYyIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19tYWxfbGlmZXRpbWUsIGFnZV9jb2RlLCBtYWxhcmlhKSAlPiUKICBzdW1tYXJpc2UocmVzdWx0X21hbGFyaWEgPSBtZWFuKHJlc3VsdF9tYWxhcmlhKSkKCnNlcm9faGlzdG9yaWNtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfaGlzdG9yaWNtYWxhcmlhX21hbF9saWZldGltZSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY29kZSwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBmaWxsID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fYXJlYSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsaW1pdHMgPSBjKDEsIDgpLAogICAgYnJlYWtzID0gc2VxKDEsIDgsIDEpLAogICAgbGFiZWxzID0gYygKICAgICAgIlswLTEwKSIsCiAgICAgICJbMTAtMjApIiwKICAgICAgIlsyMC0zMCkiLAogICAgICAiWzMwLTQwKSIsCiAgICAgICJbNDAtNTApIiwKICAgICAgIls1MC02MCkiLAogICAgICAiWzYwLTcwKSIsCiAgICAgICJbNzArKSIKICAgICksCiAgICBleHBhbmQgPSBjKDAsIDApCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgZXhwYW5kID0gYygwLCAwKQogICkgKwogIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfbWFsX2xpZmV0aW1lKSkgKwogIGxhYnMoCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IiwKICAgIHggPSAiQWdlIiwKICAgIHRpdGxlID0gc3RyX3dyYXAoIk1hbGFyaWEgc2Vyb3Bvc2l0aXZpdHkgYnkgaGlzdG9yaWMgZXhwb3N1cmUgYW5kIGhvdyBtYW55IHRpbWVzIHRoZXkgdGhpbmsgdGhleSBoYXZlIGhhZCBtYWxhcmlhIiwgMTAwKQogICkgKwogIGd1aWRlcygKICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2ZpbGxfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwKICAgICAgdmp1c3QgPSAxLAogICAgICBoanVzdCA9IDEKICAgICksCiAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKQogICkKCnNlcm9faGlzdG9yaWNtYWxhcmlhX21hbF9saWZldGltZQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDI0X3Nlcm9faGlzdG9yaWNfbWFsYXJpYV9tYWxfbGlmZXRpbWUucG5nIiwKICBzZXJvX2hpc3RvcmljbWFsYXJpYV9tYWxfbGlmZXRpbWUsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDExLAogIGhlaWdodCA9IDUKKQpgYGAKCgojIyBSZWxhdGlvbiB3aGVyZSBzb21lb25lIHVzdWFsbHkgYmF0aGUKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZTwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICI0bWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfcGxhY2Vfc2hvd2VyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19wbGFjZV9zaG93ZXIpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNTApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfdXNzdWFseWJhdGhlCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MjVfc2Vyb180bWFsYXJpYV9kaXN0cmljdF91c3N1YWx5YmF0aGUucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfcGxhY2Vfc2hvd2VyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19wbGFjZV9zaG93ZXIpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNjApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF91c3N1YWx5YmF0aGUKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QyNl9zZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfdXNzdWFseWJhdGhlLnBuZyIsCiAgc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVGltZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidGltZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfcGxhY2Vfc2hvd2VyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19wbGFjZV9zaG93ZXIpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNSkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQoKc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDI3X3Nlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF91c3N1YWx5YmF0aGUucG5nIiwKICBzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfdXNzdWFseWJhdGhlLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMiwKICBoZWlnaHQgPSA4LjUKKQpgYGAKCgojIyBSZWxhdGlvbiB3aXRoIHRob3NlIHdobyBoYXZlIGEgbW9zcXVpdG8gbmV0CgojIyMgQnkgNCBNYWxhcmlhCgpgYGB7cn0Kc2Vyb180bWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0IDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICI0bWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfbW9zcV9uZXQKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZmZpX2lzX21vc3FfbmV0KSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjUwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QyOF9zZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0IDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICJ0eXBlb2ZtYWxhcmlhIiwKICBhZ2VfY2F0LAogIGZmaV9pc19tb3NxX25ldAopICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF9ncmlkKAogICAgdmFycyhmZmlfaXNfbW9zcV9uZXQpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNjApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0CmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90Mjlfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQucG5nIiwKICBzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfbW9zcXVpdG5ldCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVGltZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZmZpX2lzX21vc3FfbmV0CikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19tb3NxX25ldCksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgI2xpbWl0cyA9IGMoMCwgMC41KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfbW9zcXVpdG5ldApgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDMwX3Nlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0LnBuZyIsCiAgc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCB0aG9zZSB3aG8gaGF2ZSBhIHRyaXAgaW4gdGhlIGxhc3QgbW9udGgKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAiNG1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZmZpX2lzX3RyaXBfbW9udGgKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZmZpX2lzX3RyaXBfbW9udGgpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNTApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MzFfc2Vyb180bWFsYXJpYV9kaXN0cmljdF90cmlwbW9udGgucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfdHJpcF9tb250aAopICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF9ncmlkKAogICAgdmFycyhmZmlfaXNfdHJpcF9tb250aCksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgI2xpbWl0cyA9IGMoMCwgMC42MCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQoKc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aApgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDMyX3Nlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF90cmlwbW9udGgucG5nIiwKICBzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMiwKICBoZWlnaHQgPSA4LjUKKQpgYGAKCiMjIyBCeSBUaW1lIG9mIE1hbGFyaWEKCmBgYHtyfQpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoIDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICJ0aW1lb2ZtYWxhcmlhIiwKICBhZ2VfY2F0LAogIGZmaV9pc190cmlwX21vbnRoCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc190cmlwX21vbnRoKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjUpCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF90cmlwbW9udGgKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QzM19zZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoLnBuZyIsCiAgc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIERlc2NyaXB0aXZlIDAxX2RhdGEKCmBgYHtyIGV2YWw9RkFMU0V9CnBsb3RfNF8yIDwtIGZmaV90b3RhbCAlPiUKICBmaWx0ZXIoZmZpX2lzX21hbGFyaWEgJWluJSBjKCJObyIsICJZZXMiKSkgJT4lCiAgZHJvcF9uYShhZ2VfY2F0LCBwdl9oaXN0b3JpYykgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYV9nZW5kZXIgPSBwYXN0ZShnZW5kZXIsIGZmaV9pc19tYWxhcmlhKQogICkgJT4lCiAgY291bnQocHZfaGlzdG9yaWMsIGFnZV9jYXQsIG1hbGFyaWFfZ2VuZGVyKSAlPiUKICBtdXRhdGUoUGVyY2VudGFnZSA9IG4gLyBzdW0obikpICU+JQogIG11dGF0ZSgKICAgIFBlcmNlbnRhZ2UgPSBjYXNlX3doZW4oCiAgICAgIHN0cl9kZXRlY3QobWFsYXJpYV9nZW5kZXIsICJGZW1hbGUiKSB+IFBlcmNlbnRhZ2UgKiAtMSwKICAgICAgVFJVRSB+IFBlcmNlbnRhZ2UKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB5ID0gYWdlX2NhdCwKICAgIHggPSBQZXJjZW50YWdlLAogICAgZmlsbCA9IG1hbGFyaWFfZ2VuZGVyCiAgKSkgKwogIGdlb21fY29sKAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gVFJVRSksCiAgICBjb2xvciA9ICJibGFjayIKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UgR3JvdXAiLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9ICJQb3B1bGF0aW9uIHN0cnVjdHVyZSBieSBhZ2UgZ3JvdXBzLCBnZW5kZXIgYW5kIG1hbGFyaWEgdHJhbnNtaXNzaW9uIgogICkgKwogIGZhY2V0X3dyYXAodmFycyhwdl9oaXN0b3JpYykpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGltaXRzID0gYygtMC4yNSwgMC4yNSksCiAgICBicmVha3MgPSBzZXEoLTAuMjUsIDAuMjUsIDAuMDUpLAogICAgbGFiZWxzID0gYyhwYXN0ZTAoc2VxKDI1LCAwLCAtNSksICIlIiksIHBhc3RlMChzZXEoNSwgMjUsIDUpLCAiJSIpKQogICkgKwogICMgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKAogICAgdHlwZSA9IGlubm92YXI6Omlubm92YV9wYWwoIm5wciIpKDQpLAogICAgbGltaXRzID0gYygiTWFsZSBZZXMiLCAiTWFsZSBObyIsICJGZW1hbGUgTm8iLCAiRmVtYWxlIFllcyIpCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiSGF2ZSB5b3UgZXZlciBcbmhhZCBtYWxhcmlhPyIpCiAgKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDE0LAogICAgICBoanVzdCA9IDAuNSwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSAxMiwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDEyLAogICAgICBmYWNlID0gImJvbGQiCiAgICApLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oNSwgMTUsIDUsIDE1KQogICkKYGBgCgojIERlc2NyaXB0aXZlIDAxX2RhdGEKCmBgYHtyIGV2YWw9RkFMU0V9CnBsb3RfNF8yIDwtIGZmaV90b3RhbCAlPiUKICBmaWx0ZXIoZmZpX2lzX21hbGFyaWEgJWluJSBjKCJObyIsICJZZXMiKSkgJT4lCiAgZHJvcF9uYShhZ2VfY2F0LCBwdl9oaXN0b3JpYykgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYV9nZW5kZXIgPSBwYXN0ZShnZW5kZXIsIGZmaV9pc19tYWxhcmlhKQogICkgJT4lCiAgY291bnQocHZfaGlzdG9yaWMsIGFnZV9jYXQsIG1hbGFyaWFfZ2VuZGVyKSAlPiUKICBtdXRhdGUoUGVyY2VudGFnZSA9IG4gLyBzdW0obikpICU+JQogIG11dGF0ZSgKICAgIFBlcmNlbnRhZ2UgPSBjYXNlX3doZW4oCiAgICAgIHN0cl9kZXRlY3QobWFsYXJpYV9nZW5kZXIsICJGZW1hbGUiKSB+IFBlcmNlbnRhZ2UgKiAtMSwKICAgICAgVFJVRSB+IFBlcmNlbnRhZ2UKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB5ID0gYWdlX2NhdCwKICAgIHggPSBQZXJjZW50YWdlLAogICAgZmlsbCA9IG1hbGFyaWFfZ2VuZGVyCiAgKSkgKwogIGdlb21fY29sKAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gVFJVRSksCiAgICBjb2xvciA9ICJibGFjayIKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UgR3JvdXAiLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9ICJQb3B1bGF0aW9uIHN0cnVjdHVyZSBieSBhZ2UgZ3JvdXBzLCBnZW5kZXIgYW5kIG1hbGFyaWEgdHJhbnNtaXNzaW9uIgogICkgKwogIGZhY2V0X3dyYXAodmFycyhwdl9oaXN0b3JpYykpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGltaXRzID0gYygtMC4yNSwgMC4yNSksCiAgICBicmVha3MgPSBzZXEoLTAuMjUsIDAuMjUsIDAuMDUpLAogICAgbGFiZWxzID0gYyhwYXN0ZTAoc2VxKDI1LCAwLCAtNSksICIlIiksIHBhc3RlMChzZXEoNSwgMjUsIDUpLCAiJSIpKQogICkgKwogICMgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKAogICAgdHlwZSA9IGlubm92YXI6Omlubm92YV9wYWwoIm5wciIpKDQpLAogICAgbGltaXRzID0gYygiTWFsZSBZZXMiLCAiTWFsZSBObyIsICJGZW1hbGUgTm8iLCAiRmVtYWxlIFllcyIpCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiSGF2ZSB5b3UgZXZlciBcbmhhZCBtYWxhcmlhPyIpCiAgKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDE0LAogICAgICBoanVzdCA9IDAuNSwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSAxMiwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDEyLAogICAgICBmYWNlID0gImJvbGQiCiAgICApLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oNSwgMTUsIDUsIDE1KQogICkKYGBgCgojIyBTYW5rZXlfc2Vyb3Bvc2l0aXZlCgoKYGBge3J9CmxpYnJhcnkoZ2dzYW5rZXkpCgpmZmlfZm9ybWF0X3NhbmtleSA8LSBmZmlfdG90YWwgJT4lCiAgbXV0YXRlKAogICAgZmZpX2lzX2FjY2Vzc19tYWxhcmlhX3luX2hmID0gZmFjdG9yKAogICAgICBmZmlfaXNfYWNjZXNzX21hbGFyaWFfeW5faGYsCiAgICAgIGxhYmVsID0gYygiTm8iLCAiWWVzIikKICAgICksCiAgICBmZmlfaXNfbWFsX2xpZmV0aW1lID0gYXMuY2hhcmFjdGVyKGZmaV9pc19tYWxfbGlmZXRpbWUpLAogICAgZmZpX2lzX21hbF9saWZldGltZSA9IHJlcGxhY2VfbmEoZmZpX2lzX21hbF9saWZldGltZSwgIjAgdGltZXMiKSwKICAgIGZmaV9pc19tYWxfbGlmZXRpbWUgPSBmYWN0b3IoCiAgICAgIGZmaV9pc19tYWxfbGlmZXRpbWUsCiAgICAgIGxhYmVscyA9IGMoCiAgICAgICAgIjAgdGltZXMiLAogICAgICAgICIxIHRvIDMgdGltZXMiLAogICAgICAgICIzIHRvIDcgdGltZXMiLAogICAgICAgICJNb3JlIHRoYW4gNyB0aW1lcyIKICAgICAgKQogICAgKQogICkKCnNhbmtleV9zZXJvcG9zaXRpdmVfYW5zdzEgPC0gZmZpX2Zvcm1hdF9zYW5rZXkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMocmVjZW50X2V4cG9zdXJlLCBmZmlfaXNfbWFsX2xpZmV0aW1lLCBmZmlfaXNfYWNjZXNzX21hbGFyaWFfeW5faGYpLAogICAgbmFtZXNfdG8gPSAibWFsYXJpYV9iZWhhdmlvcjEiLAogICAgdmFsdWVzX3RvID0gIm1hbGFyaWFfYW5zdzEiCiAgKSAlPiUKICBjb3VudChtYWxhcmlhX2JlaGF2aW9yMSwgbWFsYXJpYV9hbnN3MSkgJT4lCiAgZ3JvdXBfYnkobWFsYXJpYV9iZWhhdmlvcjEpICU+JQogIG11dGF0ZSgKICAgIHBlcmNlbnRhZ2UgPSBzY2FsZXM6OnBlcmNlbnQoCiAgICAgIG4gLyBzdW0obiksCiAgICAgIGFjY3VyYWN5ID0gMC4xCiAgICApCiAgKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYV9iZWhhdmlvcjEgPSBmY3RfcmVsZXZlbCgKICAgICAgbWFsYXJpYV9iZWhhdmlvcjEsCiAgICAgICJmZmlfaXNfbWFsX2xpZmV0aW1lIiwKICAgICAgImZmaV9pc19hY2Nlc3NfbWFsYXJpYV95bl9oZiIsCiAgICAgICJyZWNlbnRfZXhwb3N1cmUiCiAgICApLAogICAgbWFsYXJpYV9wZXJjZW50MSA9IHBhc3RlMCgKICAgICAgbWFsYXJpYV9hbnN3MSwKICAgICAgcGFzdGUwKCJcbigiLCBwZXJjZW50YWdlLCAiKSIpCiAgICApLAogICAgbWFsYXJpYV9wZXJjZW50MSA9IGFzX2ZhY3RvcihtYWxhcmlhX3BlcmNlbnQxKQogICkgJT4lCiAgc2VsZWN0KG1hbGFyaWFfYmVoYXZpb3IxLCBtYWxhcmlhX2Fuc3cxLCBtYWxhcmlhX3BlcmNlbnQxKQoKCnNhbmtleV9zZXJvcG9zaXRpdmUgPC0gZmZpX2Zvcm1hdF9zYW5rZXkgJT4lCiAgZHJvcF9uYShmZmlfaXNfbWFsX2xpZmV0aW1lLCAKICBmZmlfaXNfYWNjZXNzX21hbGFyaWFfeW5faGYsCiAgcmVjZW50X2V4cG9zdXJlCiAgKSAlPiUKICBtYWtlX2xvbmcoCiAgICBmZmlfaXNfbWFsX2xpZmV0aW1lLAogICAgZmZpX2lzX2FjY2Vzc19tYWxhcmlhX3luX2hmLCAKICAgIHJlY2VudF9leHBvc3VyZQogICkgJT4lCiAgbGVmdF9qb2luKAogICAgc2Fua2V5X3Nlcm9wb3NpdGl2ZV9hbnN3MSwKICAgICAgYnkgPSBjKAogICAgICAgICJ4IiA9ICJtYWxhcmlhX2JlaGF2aW9yMSIsCiAgICAgICAgIm5vZGUiID0gIm1hbGFyaWFfYW5zdzEiCiAgICAgICkKICApICU+JQogIG11dGF0ZSgKICAgIG5vZGUgPSBtYWxhcmlhX3BlcmNlbnQxLAogICAgbm9kZSA9IGZjdF9yZXYobm9kZSkKICApICU+JQogIHNlbGVjdCgtbWFsYXJpYV9wZXJjZW50MSkgJT4lCiAgbGVmdF9qb2luKAogICAgc2Fua2V5X3Nlcm9wb3NpdGl2ZV9hbnN3MSwKICAgIGJ5ID0gYygKICAgICAgIm5leHRfeCIgPSAibWFsYXJpYV9iZWhhdmlvcjEiLAogICAgICAibmV4dF9ub2RlIiA9ICJtYWxhcmlhX2Fuc3cxIgogICAgKQogICkgJT4lCiAgbXV0YXRlKG5leHRfbm9kZSA9IG1hbGFyaWFfcGVyY2VudDEpICU+JQogIHNlbGVjdCgtbWFsYXJpYV9wZXJjZW50MSkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSB4LAogICAgbmV4dF94ID0gbmV4dF94LAogICAgbm9kZSA9IG5vZGUsCiAgICBuZXh0X25vZGUgPSBuZXh0X25vZGUsCiAgICBmaWxsID0gZmFjdG9yKG5vZGUpLAogICAgbGFiZWwgPSBub2RlCiAgKSkgKwogIGdlb21fc2Fua2V5KAogICAgZmxvdy5hbHBoYSA9IC44LAogICAgbm9kZS5jb2xvciA9ICJncmF5MzAiCiAgKSArCiAgZ2VvbV9zYW5rZXlfbGFiZWwoc2l6ZSA9IDQsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJncmF5MzAiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgKICAgIGxhYmVscyA9IHN0cl93cmFwKAogICAgICBjKAogICAgICAgICJIb3cgbWFueSB0aW1lcyBkbyB5b3UgdGhpbmsgeW91IGhhdmUgaGFkIG1hbGFyaWEgaW4geW91ciBsaWZlPyIsCiAgICAgICAgIklmIHlvdSBoYWQgbWFsYXJpYSwgd291bGQgeW91IGdvIHRvIHRoZSBoZWFsdGggZmFjaWxpdHk/IiwKICAgICAgICAiUmVjZW50IGV4cG9zdXJlIHRvIGFueSB0eXBlIG9mIHBsYXNtb2RpdW0iCiAgICAgICksCiAgICAgIDMwCiAgICApCiAgKSArCiAgdGhlbWVfc2Fua2V5KGJhc2Vfc2l6ZSA9IDE4KSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBsYWJzKAogICAgeCA9IE5VTEwsCiAgICB0aXRsZSA9ICJCZWhhdmlvdXIgYXNzb2NpYXRlZCB3aXRoIHJlY2VudCBtYWxhcmlhIGV4cG9zdXJlIgogICkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSwKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDUsIDUsIDUsIDUpCiAgKQoKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QzNF9zYW5rZXlfc2Vyb3Bvc2l0aXZlLnBuZyIsCiAgICAgICBzYW5rZXlfc2Vyb3Bvc2l0aXZlLAogICAgICAgaGVpZ2h0ID0gNywKICAgICAgIHdpZHRoID0gMTQsCiAgICAgICBkcGkgPSAzMDApCmBgYAoKIyMgUmVsYXRpb24gZ2VuZGVyIGFuZCBvY3VwYXRpb24KCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlcl9lY29ub21pYyA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAiNG1hbGFyaWEiLAogIGVjb25vbWljX2FjdGl2aXRpZXMsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gZWNvbm9taWNfYWN0aXZpdGllcywKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkVjb25vbWljIEFjdGl2aXRpZXMiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwKICAgICAgdmp1c3QgPSAxLAogICAgICBoanVzdCA9IDEKICAgICkKICApCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlcl9lY29ub21pYwpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDM1X3Nlcm9fNG1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyX2Vjb25vbWljLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9kaXN0cmljdF9nZW5kZXJfZWNvbm9taWMsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDExLAogIGhlaWdodCA9IDcuNSwKICBzY2FsZSA9IDAuOQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInR5cGVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTFfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTJfc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMgTWFwcwoKYGBge3J9CmxpYnJhcnkoc2YpCmxpYnJhcnkobGVhZmxldCkKYGBgCgpgYGB7cn0KZmZpX3RvdGFsX2dwcyA8LSBmZmlfdG90YWwgJT4lCiAgc2VsZWN0KAogICAgZmZpX2lzX2NvZF9jb206ZmZpX2lzX2NvZF9pbmQsCiAgICBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsCiAgICBwdl9leHBvc3VyZTpoaXN0b3JpY2FsX2V4cG9zdXJlCiAgKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBmZmlfaG91c2Vob2xkICU+JQogICAgICBzZWxlY3QoCiAgICAgICAgZmZpX2hfY29kZV9jb21tdW5pdHk6ZmZpX2hfY29kZV9ob3VzZWhvbGQsCiAgICAgICAgZmZpX2hfY29tbXVuaXR5CiAgICAgICksCiAgICBieSA9IGMoCiAgICAgICJmZmlfaXNfY29kX2NvbSIgPSAiZmZpX2hfY29kZV9jb21tdW5pdHkiLAogICAgICAiZmZpX2lzX2NvZF9ob3VzZWhvbGQiID0gImZmaV9oX2NvZGVfaG91c2Vob2xkIgogICAgKQogICkgCgpmZmlfaG91c2Vob2xkX2dwcyA8LSBmZmlfdG90YWxfZ3BzICU+JQogIHNlbGVjdCgKICAgIGZmaV9pc19jb2RfY29tOmZmaV9pc19jb2RfaG91c2Vob2xkLAogICAgZmZpX2hfY29tbXVuaXR5LAogICAgcmVjZW50X2V4cG9zdXJlCiAgKSAlPiUKICBtdXRhdGUoCiAgICByZWNlbnRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHJlY2VudF9leHBvc3VyZSA9PSAiUG9zaXRpdmUiIH4gMSwKICAgICAgVFJVRSB+IDAKICAgICkKICApICU+JQogIGdyb3VwX2J5KAogICAgYWNyb3NzKGMoZmZpX2lzX2NvZF9jb206ZmZpX2hfY29tbXVuaXR5KSkKICApICU+JQogIHN1bW1hcmlzZSgKICAgIHJlY2VudF9leHBvc3VyZSA9IG1lYW4ocmVjZW50X2V4cG9zdXJlKQogICkgJT4lCiAgdW5ncm91cCgpCiAgIyBtdXRhdGUoCiAgIyAgIGNvbG9yX21hcmtlciA9IGNhc2Vfd2hlbigKICAjICAgICByZWNlbnRfZXhwb3N1cmUgPT0gMCB+ICJyZWQiLAogICMgICAgIFRSVUUgfiAiYmxhY2siCiAgIyAgICkKICAjICkKCmZmaV9ob3VzZWhvbGRfZ3BzIDwtIGZmaV9ob3VzZWhvbGRfZ3BzICU+JQogIGxlZnRfam9pbigKICAgIGZmaV9ob3VzZWhvbGQgJT4lCiAgICAgIHNlbGVjdCgKICAgICAgICBmZmlfaF9jb2RlX2NvbW11bml0eTpmZmlfaF9jb2RlX2hvdXNlaG9sZCwKICAgICAgICBmZmlfaF9kaXN0cmljdCwKICAgICAgICBmZmlfZ3BzX2xvbmcsCiAgICAgICAgZmZpX2dwc19sYXQKICAgICAgKSwKICAgIGJ5ID0gYygKICAgICAgImZmaV9pc19jb2RfY29tIiA9ICJmZmlfaF9jb2RlX2NvbW11bml0eSIsCiAgICAgICJmZmlfaXNfY29kX2hvdXNlaG9sZCIgPSAiZmZpX2hfY29kZV9ob3VzZWhvbGQiCiAgICApCiAgKSAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9ob3VzZWhvbGRfaWQgPSBwYXN0ZTAoZmZpX2lzX2NvZF9jb20sIGZmaV9pc19jb2RfaG91c2Vob2xkKSwKICAgIGZmaV9pc19jb2RfY29tX2xhYmVsID0gcGFzdGUwKAogICAgICAiQ29kOiAiLAogICAgICBmZmlfaXNfY29kX2hvdXNlaG9sZCwKICAgICAgIiAtICIsCiAgICAgIHN0cl90b190aXRsZShmZmlfaF9jb21tdW5pdHkpLAogICAgICAiICgiLAogICAgICBzdHJfdG9fdGl0bGUoZmZpX2hfZGlzdHJpY3QpLAogICAgICAiKSIKICAgICkKICApICU+JQogIHN0X2FzX3NmKAogICAgY29vcmRzID0gYygiZmZpX2dwc19sb25nIiwgImZmaV9ncHNfbGF0IiksCiAgICBjcnMgPSA0MzI2CiAgKSAKICAKCiAgCiMgY29sb3JzX3BhbCA8LSByZXYoaW5ub3Zhcjo6Omlubm92YV9wYWxldHRlc1tbImVjb21zdCJdXSkKIyBwYWwgPC0gY29sb3JOdW1lcmljKAojICAgY29sb3JSYW1wKGNvbG9yc19wYWwpLAojICAgZmZpX2hvdXNlaG9sZF9ncHMkcmVjZW50X2V4cG9zdXJlCiMgKQoKcGFsIDwtIGNvbG9yTnVtZXJpYygKICBoY2wuY29sb3JzKDE3LCBwYWxldHRlID0gInppc3NvdSIpLAogIGZmaV9ob3VzZWhvbGRfZ3BzJHJlY2VudF9leHBvc3VyZQopCgojIGljb25zX2hvdXNlaG9sZCA8LSBhd2Vzb21lSWNvbnMoCiMgICBpY29uID0gImlvcy1ob21lIiwKIyAgIGljb25Db2xvciA9ICJibGFjayIsCiMgICBsaWJyYXJ5ID0gImlvbiIsCiMgICBtYXJrZXJDb2xvciA9IGlubm92YXI6Omlubm92YV9wYWwoImVjb21zdCIsIHJldmVyc2UgPSBUUlVFKSgxNykKIyApCgpjb21tdW5pdGllc19zZiA8LSBjb21tdW5pdGllc19zZiAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2hfY29tbXVuaXR5KQogICkgJT4lCiAgbGVmdF9qb2luKAogICAgZmZpX2hvdXNlaG9sZCAlPiUKICAgICAgc2VsZWN0KGZmaV9oX2Rpc3RyaWN0LCBmZmlfaF9jb2RlX2NvbW11bml0eSkgJT4lCiAgICAgIGRpc3RpbmN0KCkKICApICAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9jb21tdW5pdHlfbGFiZWwgPSBwYXN0ZTAoCiAgICAgIGZmaV9oX2NvbW11bml0eSwKICAgICAgIiAoIiwKICAgICAgc3RyX3RvX3RpdGxlKGZmaV9oX2Rpc3RyaWN0KSwKICAgICAgIikiCiAgICApCiAgKQoKCgpob3VzZWhvbGRfY29tbXVuaXRpZXNfbGVhZnQgPC0gZmZpX2hvdXNlaG9sZF9ncHMgJT4lCiAgbGVhZmxldCgpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMoCiAgICBwcm92aWRlcnMkT3BlblN0cmVldE1hcCwKICAgIGdyb3VwID0gIk9wZW5TdHJlZXRNYXAiCiAgKSAlPiUKICBhZGRDaXJjbGVNYXJrZXJzKAogICAgbGF5ZXJJZCA9IH5mZmlfaF9ob3VzZWhvbGRfaWQsCiAgICBsYWJlbCA9IH5mZmlfaXNfY29kX2NvbV9sYWJlbCwKICAgIGNvbG9yID0gfiBwYWwocmVjZW50X2V4cG9zdXJlKSwKICAgIGdyb3VwID0gIkhvdXNlaG9sZHMiLAogICAgcmFkaXVzID0gNywKICAgIHdlaWdodCA9IDUsCiAgICBvcGFjaXR5ID0gMSwKICAgIGZpbGxPcGFjaXR5ID0gMC4xLAogICAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKAogICAgICBzdHlsZSA9IGxpc3QoCiAgICAgICAgImZvbnQtd2VpZ2h0IiA9ICJib2xkIiwKICAgICAgICBwYWRkaW5nID0gIjNweCA4cHgiCiAgICAgICksCiAgICAgIHRleHRzaXplID0gIjEycHgiLAogICAgICBkaXJlY3Rpb24gPSAiYXV0byIKICAgICkKICApICU+JQogICMgYWRkTGVnZW5kKAogICMgICB0aXRsZSA9ICJSZWNlbnQgRXhwb3N1cmUiLAogICMgICBwYWwgPSBwYWwsIAogICMgICB2YWx1ZXMgPSB+IHJlY2VudF9leHBvc3VyZSwgCiAgIyAgIGdyb3VwID0gImNpcmNsZXMiLCAKICAjICAgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIsCiAgIyAgIHRyYW5zZm9ybSA9IH4gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICMgICBvcGFjaXR5ID0gMQogICMgKSAlPiU8Zm9udC1hd2Vzb21lLWljb24gaWNvbj0iZmEtc29saWQgZmEtbG9jYXRpb24tZG90IiAvPgogIGxlYWZsZWdlbmQ6OmFkZExlZ2VuZE51bWVyaWMoCiAgICB0aXRsZSA9ICJSZWNlbnQgRXhwb3N1cmUiLAogICAgcGFsID0gcGFsLAogICAgdmFsdWVzID0gfiByZWNlbnRfZXhwb3N1cmUsCiAgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsCiAgICBvcmllbnRhdGlvbiA9ICJob3Jpem9udGFsIiwKICAgIGhlaWdodCA9IDIwLAogICAgd2lkdGggPSAxMDAsCiAgICBkZWNyZWFzaW5nID0gRkFMU0UsCiAgICBudW1iZXJGb3JtYXQgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICBncm91cCA9ICJjaXJjbGVzIgogICkgICU+JQogIGFkZEF3ZXNvbWVNYXJrZXJzKAogICAgZGF0YSA9IGNvbW11bml0aWVzX3NmLAogICAgbGF5ZXJJZCA9IH5mZmlfaF9jb2RlX2NvbW11bml0eSwKICAgIGxhYmVsID0gfmZmaV9oX2NvbW11bml0eV9sYWJlbCwKICAgIGdyb3VwID0gIkNvbW11bml0aWVzIgogICkgJT4lCiAgYWRkUHJvdmlkZXJUaWxlcygKICAgIHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwLAogICAgZ3JvdXAgPSAiT3BlblN0cmVldE1hcCIKICApICU+JQogIGFkZFRpbGVzKAogICAgdXJsVGVtcGxhdGUgPSAiaHR0cDovL210MC5nb29nbGUuY29tL3Z0L2x5cnM9bSZobD1lbiZ4PXt4fSZ5PXt5fSZ6PXt6fSZzPUdhIiwKICAgIGF0dHJpYnV0aW9uID0gIkdvb2dsZSBNYXBzIiwKICAgIG9wdGlvbnMgPSBsZWFmbGV0Ojp0aWxlT3B0aW9ucygKICAgICAgbWF4TmF0aXZlWm9vbSA9IDE5LAogICAgICBtYXhab29tID0gMjAKICAgICksCiAgICBncm91cCA9ICJHb29nbGUgTWFwcyIKICApICU+JQogIGFkZFRpbGVzKAogICAgdXJsVGVtcGxhdGUgPSAiaHR0cHM6Ly9tdDEuZ29vZ2xlLmNvbS92dC9seXJzPXMmeD17eH0meT17eX0mej17en0iLAogICAgYXR0cmlidXRpb24gPSAiU2F0ZWxsaXRlIFZpZXciLAogICAgb3B0aW9ucyA9IGxlYWZsZXQ6OnRpbGVPcHRpb25zKAogICAgICBtYXhOYXRpdmVab29tID0gMTksCiAgICAgIG1heFpvb20gPSAyMAogICAgKSwKICAgIGdyb3VwID0gIlNhdGVsbGl0ZSBWaWV3IgogICkgJT4lCiAgIyBMYXllcnMgY29udHJvbCoKICBhZGRMYXllcnNDb250cm9sKAogICAgb3ZlcmxheUdyb3VwcyA9IGMoIkhvdXNlaG9sZHMiLCAiQ29tbXVuaXRpZXMiKSwKICAgIGJhc2VHcm91cHMgPSBjKCJPcGVuU3RyZWV0TWFwIiwgIkdvb2dsZSBNYXBzIiwgIlNhdGVsbGl0ZSBWaWV3IiksCiAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpCiAgKSAlPiUKICAjIGFkZExlZ2VuZCgKICAjICAgInRvcHJpZ2h0IiwKICAjICAgcGFsID0gaW5ub3Zhcjo6aW5ub3ZhX3BhbCgiZWNvbXN0IiwgcmV2ZXJzZSA9IFRSVUUpKDk4MCkKICAjICkgICU+JQogICMgYWRkTGVnZW5kKAogICMgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsCiAgIyAgIGNvbG9ycyA9IGMoCiAgIyAgICAgIndoaXRlOyB3aWR0aDoxNXB4OyBoZWlnaHQ6MTVweDsKICAjICAgICAgICAgICAgICAgIGJvcmRlcjo1cHggc29saWQgcmVkOyBib3JkZXItcmFkaXVzOjUwJTsiLAogICMgICAgICJ3aGl0ZTsgd2lkdGg6Ny41cHg7IGhlaWdodDo3LjVweDsgbWFyZ2luLXRvcDogNXB4OwogICMgICAgICAgICAgICAgICAgYm9yZGVyOjVweCBzb2xpZCBibGFjazsgYm9yZGVyLXJhZGl1czo1MCU7IG1hcmdpbi1sZWZ0OjJweDsiCiAgIyAgICksCiAgIyAgIGxhYmVscyA9IGMoCiAgIyAgICAgIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAxMHB4OwogICMgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogOHB4O2xpbmUtaGVpZ2h0OiAxMHB4O2ZvbnQtd2VpZ2h0OiBib2xkOwogICMgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOyAnPkF0IGxlYXN0IDEgcGVyc29uIHdpdGggcmVjZW50IG1hbGFyaWE8L2Rpdj4iLAogICMgICAgICI8ZGl2IHN0eWxlPSdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7aGVpZ2h0OiAxMHB4OwogICMgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogOHB4O2xpbmUtaGVpZ2h0OiAxMHB4O2ZvbnQtd2VpZ2h0OiBib2xkOwogICMgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiAxMHB4OwogICMgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6NXB4Jz5ObyBvbmUgd2l0aCByZWNlbnQgbWFsYXJpYSBhdCBob3VzZWhvbGQ8L2Rpdj4iCiAgIyAgICksCiAgIyAgIG9wYWNpdHkgPSAxCiAgIyApICU+JQogIGxlYWZsZXQuZXh0cmFzOjphZGRSZXNldE1hcEJ1dHRvbigpCgpob3VzZWhvbGRfY29tbXVuaXRpZXNfbGVhZnQKYGBgCgoKYGBge3IgZXZhbD1GQUxTRX0KaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoCiAgaG91c2Vob2xkX2NvbW11bml0aWVzX2xlYWZ0LAogIGZpbGUgPSAiLi8wMl9vdXRwdXQvcGxvdHMvaG91c2Vob2xkX2NvbW11bml0aWVzX2xlYWZ0Lmh0bWwiCikKCndlYnNob3Q6OndlYnNob3QoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL2hvdXNlaG9sZF9jb21tdW5pdGllc19sZWFmdC5odG1sIiwKICAiLi8wMl9vdXRwdXQvcGxvdHMvaG91c2Vob2xkX2NvbW11bml0aWVzX2xlYWZ0LnBuZyIsCiAgY2xpcHJlY3QgPSAidmlld3BvcnQiLAogIHpvb20gPSA0CikKYGBg